在WPF中自定义你的绘制(二)
原文:在WPF中自定义你的绘制(二)

  在WPF中自定义你的绘制(二)
                                                                   周银辉

1,绘制几何图形
也许你在使用WPF进行开发的时候已经注意到一个很有意思的现象,要在屏幕上显示一个圆形(椭圆),你可以使用Ellipse对象,如下面的代码所示:

<Grid>
          <Ellipse Fill="#FFFFFFFF" Stroke="#FF000000" Margin="61,36,100,0" VerticalAlignment="Top" Height="33"/>       
    </Grid>

而另外一个名为EllipseGeometry的对象同样可以做到:

<GeometryDrawing  Brush="Blue">
         <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)一样来自定义我们的绘制:

protected override void OnRender(DrawingContext dc)
        {
            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 对象为我们绘制图片提供了方便。

 protected override void OnRender(DrawingContext dc)
        {
            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类。

<Page
    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中自定义你的绘制(三)》中我们会继续讨论自定义绘制中更深入的话题:合并绘制、利用路径绘制图形、将我们的绘制转变为画刷,谢谢!

posted on 2015-11-05 14:48 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/4939513.html

在WPF中自定义你的绘制(二)相关推荐

  1. WPF中自定义的DataTemplate中的控件,在Window_Loaded事件中加载机制初探

    原文:WPF中自定义的DataTemplate中的控件,在Window_Loaded事件中加载机制初探 最近因为项目需要,开始学习如何使用WPF开发桌面程序.使用WPF一段时间之后,感觉WPF的开发思 ...

  2. html自定义指针,如何自定义鼠标指针 怎样在wpf中自定义鼠标指针

    如何在ppt中自定义鼠标指针的形状? 魔兽世界怎么自定义鼠标指针 在系统 控制面板 里面鼠标属性 指针里面改就可以了 下面有个浏览 可以自定义换图案 怎样在网页中设定一整套自定义的鼠标指针? 麻烦了 ...

  3. 【eoe教程】Android中自定义视图的绘制方法

    原文链接 :http://android.eoe.cn/topic/ui 自定义视图最重要的部分是它的外观.你可以根据应用的需求简单或复杂的实现它. 这个教程包含了最常见的操作. 重写onDraw() ...

  4. WPF中自定义窗体标题栏

    最新文章:Virson's Blog 这个例子是在看<深入浅出WPF>第5章控件与布局的Canvas控件时,对书上的例子做了一下小扩展:在此记下,以备后用: XAML代码: 1 <W ...

  5. 【转】在WPF中自定义控件

    周银辉的开发博客(WPF) 在WPF中自定义控件(1) 一, 不一定需要自定义控件 在使用WPF以前,动辄使用自定义控件几乎成了惯性思维,比如需要一个带图片的按钮,但在WPF中此类任务却不需要如此大费 ...

  6. Android中 自定义logo二维码绘制(仿微信QQ二维码)

    自定义Logo二维码绘制(追加上一篇简单二维码绘制) 1.实现思路 2.实现(新增拍照以及相册上传logo以及分享和保存二维码) 简单绘制二维码地址: Android 实现简单绘制二维码(包含带LOG ...

  7. Winform中使用zxing和Graphics实现自定义绘制二维码布局

    场景 zxing.dll下载 https://download.csdn.net/download/badao_liumang_qizhi/11623214 效果 实现 根据上面文章中将简单的二维码生 ...

  8. WPF中的命令与命令绑定(二)

    WPF中的命令与命令绑定(二)                                              周银辉 在WPF中,命令(Commanding)被分割成了四个部分,分别是IC ...

  9. WPF中GDI+图形图像的绘制:(五)绘制图像——蒙板效果

    这里要实现的效果指的是对图片像素点区域进行颜色叠加,首先要做的是得到图片非透明部分的区域,效果如图: 实现步骤:1.在主窗体添加控制控件: <Label Grid.Row="4&quo ...

最新文章

  1. 使用TestStack.White进行Windows UI的自动化测试 (1) 基础篇
  2. Bio+IT 生信科技爱好者知识库
  3. tflearn anaconda 安装过程记录
  4. mysql查询大于0的标记_MySQL如何查询回答数大于0的问题并分页
  5. linux网络编程Internet Socket地址,套接字,和函数
  6. linux 脚本 发送邮件,shell 脚本发送邮件
  7. entity framework使用技巧
  8. RocketMQ在Windows环境下部署(亲测有效)
  9. python字典和JSON格式的转换
  10. 【BZOJ2157】旅游,树链剖分练习
  11. 春眠不觉晓,读书醒醒脑|世界读书日送送送10本硬核书
  12. 嘘,iPhone 正在监听你!
  13. JavaScript对象与创建对象的方式
  14. ASP.NET-第二天-加强课程
  15. svn   /lib64/libz.so.1: no version information available
  16. 5. 在Windows上安装Git
  17. java 16进制转字符串 乱码_Java中16进制与字符串之间的相互转换
  18. Win10上轻松安装docker,更改镜像安装目录
  19. 【 第一章:初识 ts】
  20. 算法的时间复杂度取决于:

热门文章

  1. c语言五个整数排列,刚学c语言,老师让用if编一个五个数字从大到小的排序,有那个大神能帮我,谢谢啦...
  2. iview table增加一行减少一行_OA协会领导一行赴深圳市办公设备租赁行业协会参观交流...
  3. 坚果pro2 android 8,手机 篇一:坚果Pro2特别版使用感受
  4. android 内核裁剪概述,Android内核的编译与裁剪
  5. 直接部署nginx和在docker里面部署nginx性能上有区别吗
  6. Maven项目报错invalid LOC header (bad signature)
  7. Eclipse关闭无用validation
  8. 算法与数据结构简单启蒙,我当年学习算法走过的坑
  9. 【HAOI2008】【BZOJ1045】糖果传递(环形纸牌均分,前缀和)
  10. NYOJ463 - 九九乘法表