WPF 2D绘图(3)PathGeometry

摘要:
PathGeometry可以创建任意的2D图形形状。

PathGeometry可以创建任意的2D图形形状。

其内部通过PathSegment集合来实现

image

如画2个三角形

          <Path Stroke="Black" StrokeThickness="1">
            <Path.Data>
              <PathGeometry>
                <PathGeometry.Figures>
                  <PathFigureCollection>
                    <PathFigure IsClosed="True" StartPoint="10,100">
                      <PathFigure.Segments>
                        <PathSegmentCollection>
                          <LineSegment Point="100,100" />
                          <LineSegment Point="100,50" />
                        </PathSegmentCollection>
                      </PathFigure.Segments>
                    </PathFigure>
                    <PathFigure IsClosed="True" StartPoint="10,10">
                      <PathFigure.Segments>
                        <PathSegmentCollection>
                          <LineSegment Point="100,10" />
                          <LineSegment Point="100,40" />
                        </PathSegmentCollection>
                      </PathFigure.Segments>
                    </PathFigure>                    
                  </PathFigureCollection>
                </PathGeometry.Figures>
              </PathGeometry>
            </Path.Data>
          </Path>

image

外边框和笔刷均由Path提供,Geometry只负责绘制形状

为简化上面xaml,wpf提供了路径语法解析器,由

          <Path Stroke="Black" StrokeThickness="1" 
            Data="M 10,100 L 100,100 100,50 Z M 10,10 100,10 100,40 Z" />

孰能生巧而已,用多了就自然会了。

性能更好的StreamGeometry

不管Shape,Geometry还是Segment,其提供的熟悉均是依赖属性,所以其提供了依赖属性相关的特性,绑定和动画.

若Shape不用xaml表示,而是提供一个画图的DrawRectangle等方法,提供参数传递,那么可能就没必要提供依赖属性提供支持了.这样就回归到原始画法,从而了提高了性能

如下示例,StreamGeometryContext 提供了所有Segment的方法,可以猜测StreamGeometryContext 也是对Segment对象属性的一种封装,直接调用方法则省去了Segment集合的对象以及Segment内部的依赖属性来提供性能.

var g = new StreamGeometry();
using (StreamGeometryContext context = g.Open())
{
    context.BeginFigure(new Point(100,100), false, false);
    context.LineTo(new Point(200, 100), true, false);
    context.LineTo(new Point(200, 200), true, false);
    context.LineTo(new Point(100, 100), true, false);

    context.BeginFigure(new Point(300, 200), false, false);
    context.LineTo(new Point(400, 200), true, false);
    //context.LineTo(new Point(500, 200), true, false);
    //context.LineTo(new Point(200, 100), true, false);
}

看来WPF还是以减少整体对象来提升性能的.

真正绘图的对象

FrameworkElement并不提供任何绘制图形的能力,其只是为绘图提供了必要的数据.即自上而下的封装.

Rectangle=>Create RectangleGeometry=>调用DrawingContext的DrawRoundedRectangle

若不提供Geometry,DrawingContext内部则会再次创建Geometry.

WPF的元素就是通过一个个FrameworkElement结合DrawingContext为基础,结合WPF各项特性搭积木而成,所以性能不好的时候就请查看visual tree的数量吧.

免责声明:文章转载自《WPF 2D绘图(3)PathGeometry》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇容器监控告警方案(cAdvisor + nodeExporter + alertmanager + prometheus +grafana)Spring Boot集成thymeleaf异步刷新页面下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

PSR

PSR是PHP Standards Recommendation的简称,这个是php-fig组织制定的一套规范。 PSR-1 PHP标签:PHP代码必须放在<?php ?>标签或<?= ?>标签中。 编码:PHP文件必须使用无BOM的UTF-8编码。 副作用:一个PHP文件可以定义符号(比如类、函数、常量等),或者执行只有唯一副...

Android系统编程入门系列之广播接收者BroadcastReceiver实现进程间通信

在前边几篇关于Android系统两个重要组件的介绍中,界面Activity负责应用程序与用户的交互,服务Service负责应用程序内部线程间的交互或两个应用程序进程之间的数据交互。看上去这两大组件就能满足日常应用程序的开发需求了,可是应用程序之间的交互,如果都使用服务Service中的AIDL规范,那每个应用程序本身岂不是要声明其他应用程序中的一些接口?这...

WPF绑定功能常用属性介绍

1.Mode 绑定中数据流的方向(enum BindingMode) 目标属性指的是控件的属性 (1)TwoWay 更改源属性或目标属性时,会自动更新另一方。适用于可编辑窗体 例:TextBox (2)OneWay 更改源属性时会自动更新目标属性。适用于隐形只读窗体 例:Label 可避免 System.Windows.Data.BindingMode.T...

vue3.0用vue-awesome-swiper

使用新版vue-awesome-swiper出现了一些bug vue-awesome-swiper组件pagination小圆点不显示问题 不会自动播放 swiper没有css 参考如下配置 基本使用方法 1.安装 cnpm install vue-awesome-swiper --save 2.引用 /*全局引入*/ import VueAwes...

wpf treeview 数据绑定 递归绑定节点

1.先上效果 将所有节点加入ComboBox数据源,在ComboBox中选择时下方Treeview显示该节点下的子节点。 1.xaml文件,将以下代码加入界面合适位置 1     <StackPanel> 2 <StackPanel Margin="10"> 3 <La...

Android实现程序前后台切换效果

太久没动这一块了。借助了下面的文章得到了类似QQ的效果 ,是比较复杂的TABHOST的处理~有需要的Q我。 转了下面的文章: ================ 本文演示如何在Android中实现程序前后台切换效果。    在介绍程序实现之前,我们先看下Android中Activities和Task的基础知识。   我们都知道,一个Activity...