在WPF中自定义你的绘制(五)

时间:2022-01-18 09:44:20

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

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

将我们的绘制转变为画刷

WPF中的画刷比GDI+中要强大得多,除了常用的实心画刷、渐变画刷外,还支持更多的平铺画刷,这包括DrawingBrush、ImageBrush、VisualBrush,其中DrawingBrush使得我们可以将自定义的绘制用于任何可以使用普通画刷的地方。
比如下面的代码,我们将自定义一个椭圆和一个矩形,然后将它们合并成一个图形并将

改图形用作窗口的背景画刷:

在WPF中自定义你的绘制(五)public Window1()
在WPF中自定义你的绘制(五)在WPF中自定义你的绘制(五)        在WPF中自定义你的绘制(五){
在WPF中自定义你的绘制(五)            InitializeComponent();
在WPF中自定义你的绘制(五)
在WPF中自定义你的绘制(五)
在WPF中自定义你的绘制(五)            //background
在WPF中自定义你的绘制(五)            EllipseGeometry ellipse = new EllipseGeometry(new Point(50, 50), 50, 20);
在WPF中自定义你的绘制(五)            RectangleGeometry rect = new RectangleGeometry(new Rect(50, 50, 50, 20), 5, 5);
在WPF中自定义你的绘制(五)            PathGeometry combin = Geometry.Combine(ellipse, rect, GeometryCombineMode.Xor, null);
在WPF中自定义你的绘制(五)            GeometryDrawing drawing = new GeometryDrawing(Brushes.LightBlue, new Pen(Brushes.Green, 2), combin);
在WPF中自定义你的绘制(五)
在WPF中自定义你的绘制(五)            DrawingBrush background = new DrawingBrush(drawing);
在WPF中自定义你的绘制(五)            this.Background = background;
在WPF中自定义你的绘制(五)
在WPF中自定义你的绘制(五)
在WPF中自定义你的绘制(五)        }

运行效果如下:
在WPF中自定义你的绘制(五)

也许将整个图形填充于整个区域并不是我们想要的结果,没关系,我们可以通过设置视口(Viewport)和平铺方式(TileMode)来调整图形的平铺效果。
在WPF中自定义你的绘制(五)
Viewport为我们指示了如何将图形投射到绘制表面,如果我们将绘制表面的左上角定义为(0,0),右下角定义我(1,1),那么可以设置一个相当与该值的矩形(Rect)来指示我们的图形应该被投射到哪里。比如Rect(0,0,0.5,0.5)则表示在绘制表面的左上角开始的长宽均为绘制表面1/2的矩形区域。这样的矩形Rect(0,0,0.5,0.5)就是我们所说的视口(这与3D中的视口类似)。所以要得到上图的效果,我们只需要这样设置我们的DrawingBrush就可以了:

在WPF中自定义你的绘制(五)background.Viewport = new Rect(0, 0, 0.15, 0.15);
在WPF中自定义你的绘制(五)background.TileMode = TileMode.Tile;

此外,DrawingBrush还有一个很有意思的属性ViewBox(继承于TileBrush),它指示了只取图形中的哪一部分作为观察区域(这与Clip不同),它的定义方式与Viewport类似,但它不是相对于绘制表面而是相当于我们的图形的。
SDK中是这样解释ViewBox的:
在WPF中自定义你的绘制(五)
参考下面的代码,我们仅仅取了整个绘制的图形的1/4(整个图形的左下部分)并将其作为窗口的的背景画刷:

在WPF中自定义你的绘制(五) public Window1()
在WPF中自定义你的绘制(五)在WPF中自定义你的绘制(五)        在WPF中自定义你的绘制(五){
在WPF中自定义你的绘制(五)            InitializeComponent();
在WPF中自定义你的绘制(五)
在WPF中自定义你的绘制(五)
在WPF中自定义你的绘制(五)            //background
在WPF中自定义你的绘制(五)            EllipseGeometry ellipse = new EllipseGeometry(new Point(50, 50), 50, 20);
在WPF中自定义你的绘制(五)            RectangleGeometry rect = new RectangleGeometry(new Rect(50, 50, 50, 20), 5, 5);
在WPF中自定义你的绘制(五)            PathGeometry combin = Geometry.Combine(ellipse, rect, GeometryCombineMode.Xor, null);
在WPF中自定义你的绘制(五)            GeometryDrawing drawing = new GeometryDrawing(Brushes.LightBlue, new Pen(Brushes.Green, 2), combin);
在WPF中自定义你的绘制(五)
在WPF中自定义你的绘制(五)            DrawingBrush background = new DrawingBrush(drawing);
在WPF中自定义你的绘制(五)            background.Viewbox = new Rect(0.5, 0.5, 0.5, 0.5);
在WPF中自定义你的绘制(五)            this.Background = background;
在WPF中自定义你的绘制(五)
在WPF中自定义你的绘制(五)
在WPF中自定义你的绘制(五)        }

效果图如下:
在WPF中自定义你的绘制(五)

此外,值得一提的是,Viewport和Viewbox除了使用相对值外,你也可以使用绝对坐标值,不过你需要将ViewportUnits属性和ViewboxUnit属性由BrushMappingMode.RelativeToBoundingBox修改为BrshMappingMode.Absolute。

在WPF中自定义你的绘制(五)的更多相关文章

  1. 在WPF中自定义你的绘制(三)

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

  2. 在WPF中自定义你的绘制(四)

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

  3. 在WPF中自定义你的绘制(一)

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

  4. 在WPF中自定义你的绘制(二)

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

  5. 在VS2005中设置WPF中自定义按钮的事件

    原文:在VS2005中设置WPF中自定义按钮的事件 上篇讲了如何在Blend中绘制圆角矩形(http://blog.csdn.net/johnsuna/archive/2007/08/13/17407 ...

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

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

  7. 示例:WPF中自定义MessageService应用DialogHost、Snackbar、NotifyIcon显示各种场景提示消息

    原文:示例:WPF中自定义MessageService应用DialogHost.Snackbar.NotifyIcon显示各种场景提示消息 一.目的:不同交互场景需要提示不同的消息,不同的消息需要用不 ...

  8. 示例:WPF中自定义StoryBoarService在代码中封装StoryBoard、Animation用于简化动画编写

    原文:示例:WPF中自定义StoryBoarService在代码中封装StoryBoard.Animation用于简化动画编写 一.目的:通过对StoryBoard和Animation的封装来简化动画 ...

  9. WPF中自定义绘制内容

    先说结论:实现了在自定义大小的窗口中,加载图片,并在图片上绘制一个矩形框:且在窗口大小改变的情况,保持绘制的矩形框与图片的先对位置不变. 在WinForm中,我们可以很方便地绘制自己需要的内容,在WP ...

随机推荐

  1. 用git管理自己读的书

    福昕阅读器,可以方便地做书签和备注.使用git去管理图书和示例代码,一方面能够很好地保存这些资料,方便查找:另外一方面,无论在家,还是在公司,都能很好地同步自己学习的进度. 福昕阅读器5(视图--&g ...

  2. css中px,em和rem的区别

    css中px,em和rem的区别 今天,突然间发现一个特别有意思的问题,就是无意间看到一个网站中的em并不是16px,下面展开了对于px和em以及rem的探究. 首先,px是绝对长度单位,是相对于显示 ...

  3. Python学习笔记7—集合

    set 拥有类似 dict 的特点:可以用{}花括号来定义:其中的元素没有序列,也就是是非序列类型的数据;而且,set 中的元素不可重复,这就类似 dict 的键. >>> s1 = ...

  4. Spring整合freemarker发送邮件

    转载:http://blog.csdn.net/zdp072/article/details/32745335 分类: freemarker spring 2014-06-20 23:39 752人阅 ...

  5. Linux C 程序 数组(EIGHT)

    数组 1.一维数组的定义和使用,声明时数组默认值为0 int a[n]; 这样定义不合法,n是变量 ,数组规定[]里只能为常量 ] = {,,,,,,,,,}; a[] = {,} ;//部分赋值 , ...

  6. [LeetCode#260]Single Number III

    Problem: Given an array of numbers nums, in which exactly two elements appear only once and all the ...

  7. ASP.NET - 多级分类

    表结构: 表数据: 最终效果: 前端代码: <%@ Page Language="C#" AutoEventWireup="true" CodeBehin ...

  8. Linux记录-使用python临时搭建web服务器

    python2: python -m SimpleHTTPServer 8888 python3: python -m http.server 8888 wget   ip:8888/文件

  9. Qt错误 —— 无法启动此程序 因为计算机丢失QtCore5&period;dll 以及 无法定位程序输入点于动态链接库QtCore5&period;dll

    首先,设置计算机的环境变量Path,计算机=>右键属性=>高级设置=>环境变量=>系统变量=>双击Path,在Path后面增加C:\Qt\Qt5.8.0\5.8\ming ...

  10. jvm虚拟机原理1

    JVM是虚拟机,也是一种规范,他遵循着冯·诺依曼体系结构的设计原理.冯·诺依曼体系结构中,指出计算机处理的数据和指令都是二进制数,采用存储程序方式不加区分的存储在同一个存储器里,并且顺序执行,指令由操 ...