在WPF中自定义你的绘制(二)
在WPF中自定义你的绘制(二)
周银辉
1,绘制几何图形
也许你在使用WPF进行开发的时候已经注意到一个很有意思的现象,要在屏幕上显示一个圆形(椭圆),你可以使用Ellipse对象,如下面的代码所示:
<Ellipse Fill="#FFFFFFFF" Stroke="#FF000000" Margin="61,36,100,0" VerticalAlignment="Top" Height="33"/>
</Grid>
而另外一个名为EllipseGeometry的对象同样可以做到:
<GeometryDrawing.Geometry>
<EllipseGeometry Center="50,50" RadiusX="20" RadiusY="45" />
</GeometryDrawing.Geometry>
<GeometryDrawing.Pen>
<Pen Thickness="1" Brush="Black" />
</GeometryDrawing.Pen>
</GeometryDrawing>
向后者这样由几何图形名称加Geometry后缀的,就是今天我们要讨论的几何图形.
我们可以发现,Ellipse继承于Shape类,EllipseGemotry继承于Geometry类,虽然我们利用它们都可以绘制圆形,但EllipseGeometry比Ellipse是更轻量级的类,我们使用它可以获得更好的性能效益,但EllipseGeometry不支持WPF布局系统(Layout)、输入和焦点。这也是Shape与Geometry的区别。
我们也可以使用C#代码像传统的绘制(OnPaint)一样来自定义我们的绘制:
{
base.OnRender(dc);
Geometry ellipse = new EllipseGeometry(new Point(100, 70), 100, 50);
GeometryDrawing drawing = new GeometryDrawing(Brushes.LightBlue, new Pen(Brushes.Green,1), ellipse);
dc.DrawDrawing(drawing);
}
效果如下图:
其他基本几何图形(如RectangleGeometry,LineGeometry等)与此类似。
2, 绘制图片
最简单的使用图片的方式当然是利用Image控件,就像以前我们使用PictureBox一样,但更多的我们是使用自定义方式来绘制,ImageDrawing 对象为我们绘制图片提供了方便。
{
base.OnRender(dc);
BitmapImage bmp = new BitmapImage(new Uri("http://images.cnblogs.com/logo.gif", UriKind.Absolute));
ImageDrawing drawing = new ImageDrawing(bmp, new Rect(10, 10, 326, 43));
dc.DrawDrawing(drawing);
}
效果如下:
3,绘制文本
在WPF中我们可以高度定制文本的绘制,这需要了解GlyphRunDrawing类以及GlyphRun对象,其实在我们使用TextBlock时经常使用GlyphRun对象,它包含了文本字体的很多细节属性,请参见SDK的GlyphRun类。
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:PresentationOptions="http://schemas.microsoft.com/winfx/2006/xaml/presentation/options"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="PresentationOptions"
Margin="20" Background="White">
<!-- The example shows how to use different property settings of Glyphs objects. -->
<Canvas
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Background="PowderBlue"
>
<Glyphs
FontUri = "C:\WINDOWS\Fonts\ARIAL.TTF"
FontRenderingEmSize = "36"
StyleSimulations = "ItalicSimulation"
UnicodeString = "Hello World!"
Fill = "SteelBlue"
OriginX = "50"
OriginY = "75"
/>
<!-- "Hello World!" with default kerning -->
<Glyphs
FontUri = "C:\WINDOWS\Fonts\ARIAL.TTF"
FontRenderingEmSize = "36"
UnicodeString = "Hello World!"
Fill = "Maroon"
OriginX = "50"
OriginY = "150"
/>
<!-- "Hello World!" with explicit character widths for proportional font -->
<Glyphs
FontUri = "C:\WINDOWS\Fonts\ARIAL.TTF"
FontRenderingEmSize = "36"
UnicodeString = "Hello World!"
Indices = ",80;,80;,80;,80;,80;,80;,80;,80;,80;,80;,80"
Fill = "Maroon"
OriginX = "50"
OriginY = "225"
/>
<!-- "Hello World!" with fixed-width font -->
<Glyphs
FontUri = "C:\WINDOWS\Fonts\COUR.TTF"
FontRenderingEmSize = "36"
StyleSimulations = "BoldSimulation"
UnicodeString = "Hello World!"
Fill = "Maroon"
OriginX = "50"
OriginY = "300"
/>
<!-- "Open file" without "fi" ligature -->
<Glyphs
FontUri = "C:\WINDOWS\Fonts\TIMES.TTF"
FontRenderingEmSize = "36"
StyleSimulations = "BoldSimulation"
UnicodeString = "Open file"
Fill = "SlateGray"
OriginX = "400"
OriginY = "75"
/>
<!-- "Open file" with "fi" ligature -->
<Glyphs
FontUri = "C:\WINDOWS\Fonts\TIMES.TTF"
FontRenderingEmSize = "36"
StyleSimulations = "BoldSimulation"
UnicodeString = "Open file"
Indices = ";;;;;(2:1)191"
Fill = "SlateGray"
OriginX = "400"
OriginY = "150"
/>
</Canvas>
</Page>
在《在WPF中自定义你的绘制(三)》中我们会继续讨论自定义绘制中更深入的话题:合并绘制、利用路径绘制图形、将我们的绘制转变为画刷,谢谢!
转载于:https://www.cnblogs.com/lonelyxmas/p/4939513.html
在WPF中自定义你的绘制(二)相关推荐
- WPF中自定义的DataTemplate中的控件,在Window_Loaded事件中加载机制初探
原文:WPF中自定义的DataTemplate中的控件,在Window_Loaded事件中加载机制初探 最近因为项目需要,开始学习如何使用WPF开发桌面程序.使用WPF一段时间之后,感觉WPF的开发思 ...
- html自定义指针,如何自定义鼠标指针 怎样在wpf中自定义鼠标指针
如何在ppt中自定义鼠标指针的形状? 魔兽世界怎么自定义鼠标指针 在系统 控制面板 里面鼠标属性 指针里面改就可以了 下面有个浏览 可以自定义换图案 怎样在网页中设定一整套自定义的鼠标指针? 麻烦了 ...
- 【eoe教程】Android中自定义视图的绘制方法
原文链接 :http://android.eoe.cn/topic/ui 自定义视图最重要的部分是它的外观.你可以根据应用的需求简单或复杂的实现它. 这个教程包含了最常见的操作. 重写onDraw() ...
- WPF中自定义窗体标题栏
最新文章:Virson's Blog 这个例子是在看<深入浅出WPF>第5章控件与布局的Canvas控件时,对书上的例子做了一下小扩展:在此记下,以备后用: XAML代码: 1 <W ...
- 【转】在WPF中自定义控件
周银辉的开发博客(WPF) 在WPF中自定义控件(1) 一, 不一定需要自定义控件 在使用WPF以前,动辄使用自定义控件几乎成了惯性思维,比如需要一个带图片的按钮,但在WPF中此类任务却不需要如此大费 ...
- Android中 自定义logo二维码绘制(仿微信QQ二维码)
自定义Logo二维码绘制(追加上一篇简单二维码绘制) 1.实现思路 2.实现(新增拍照以及相册上传logo以及分享和保存二维码) 简单绘制二维码地址: Android 实现简单绘制二维码(包含带LOG ...
- Winform中使用zxing和Graphics实现自定义绘制二维码布局
场景 zxing.dll下载 https://download.csdn.net/download/badao_liumang_qizhi/11623214 效果 实现 根据上面文章中将简单的二维码生 ...
- WPF中的命令与命令绑定(二)
WPF中的命令与命令绑定(二) 周银辉 在WPF中,命令(Commanding)被分割成了四个部分,分别是IC ...
- WPF中GDI+图形图像的绘制:(五)绘制图像——蒙板效果
这里要实现的效果指的是对图片像素点区域进行颜色叠加,首先要做的是得到图片非透明部分的区域,效果如图: 实现步骤:1.在主窗体添加控制控件: <Label Grid.Row="4&quo ...
最新文章
- 使用TestStack.White进行Windows UI的自动化测试 (1) 基础篇
- Bio+IT 生信科技爱好者知识库
- tflearn anaconda 安装过程记录
- mysql查询大于0的标记_MySQL如何查询回答数大于0的问题并分页
- linux网络编程Internet Socket地址,套接字,和函数
- linux 脚本 发送邮件,shell 脚本发送邮件
- entity framework使用技巧
- RocketMQ在Windows环境下部署(亲测有效)
- python字典和JSON格式的转换
- 【BZOJ2157】旅游,树链剖分练习
- 春眠不觉晓,读书醒醒脑|世界读书日送送送10本硬核书
- 嘘,iPhone 正在监听你!
- JavaScript对象与创建对象的方式
- ASP.NET-第二天-加强课程
- svn /lib64/libz.so.1: no version information available
- 5. 在Windows上安装Git
- java 16进制转字符串 乱码_Java中16进制与字符串之间的相互转换
- Win10上轻松安装docker,更改镜像安装目录
- 【 第一章:初识 ts】
- 算法的时间复杂度取决于:
热门文章
- c语言五个整数排列,刚学c语言,老师让用if编一个五个数字从大到小的排序,有那个大神能帮我,谢谢啦...
- iview table增加一行减少一行_OA协会领导一行赴深圳市办公设备租赁行业协会参观交流...
- 坚果pro2 android 8,手机 篇一:坚果Pro2特别版使用感受
- android 内核裁剪概述,Android内核的编译与裁剪
- 直接部署nginx和在docker里面部署nginx性能上有区别吗
- Maven项目报错invalid LOC header (bad signature)
- Eclipse关闭无用validation
- 算法与数据结构简单启蒙,我当年学习算法走过的坑
- 【HAOI2008】【BZOJ1045】糖果传递(环形纸牌均分,前缀和)
- NYOJ463 - 九九乘法表