PathGeometry可以创建任意的2D图形形状。
其内部通过PathSegment集合来实现
WPF 2D绘图(3)PathGeometry - 图1
如画2个三角形

  1. <Path Stroke="Black" StrokeThickness="1">
  2. <Path.Data>
  3. <PathGeometry>
  4. <PathGeometry.Figures>
  5. <PathFigureCollection>
  6. <PathFigure IsClosed="True" StartPoint="10,100">
  7. <PathFigure.Segments>
  8. <PathSegmentCollection>
  9. <LineSegment Point="100,100" />
  10. <LineSegment Point="100,50" />
  11. </PathSegmentCollection>
  12. </PathFigure.Segments>
  13. </PathFigure>
  14. <PathFigure IsClosed="True" StartPoint="10,10">
  15. <PathFigure.Segments>
  16. <PathSegmentCollection>
  17. <LineSegment Point="100,10" />
  18. <LineSegment Point="100,40" />
  19. </PathSegmentCollection>
  20. </PathFigure.Segments>
  21. </PathFigure>
  22. </PathFigureCollection>
  23. </PathGeometry.Figures>
  24. </PathGeometry>
  25. </Path.Data>
  26. </Path>

WPF 2D绘图(3)PathGeometry - 图2
外边框和笔刷均由Path提供,Geometry只负责绘制形状
为简化上面xaml,wpf提供了路径语法解析器,由

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

性能更好的StreamGeometry

不管Shape,Geometry还是Segment,其提供的熟悉均是依赖属性,所以其提供了依赖属性相关的特性,绑定和动画.
若Shape不用xaml表示,而是提供一个画图的DrawRectangle等方法,提供参数传递,那么可能就没必要提供依赖属性提供支持了.这样就回归到原始画法,从而了提高了性能
如下示例,StreamGeometryContext 提供了所有Segment的方法,可以猜测StreamGeometryContext 也是对Segment对象属性的一种封装,直接调用方法则省去了Segment集合的对象以及Segment内部的依赖属性来提供性能.

  1. var g = new StreamGeometry();
  2. using (StreamGeometryContext context = g.Open())
  3. {
  4. context.BeginFigure(new Point(100,100), false, false);
  5. context.LineTo(new Point(200, 100), true, false);
  6. context.LineTo(new Point(200, 200), true, false);
  7. context.LineTo(new Point(100, 100), true, false);
  8. context.BeginFigure(new Point(300, 200), false, false);
  9. context.LineTo(new Point(400, 200), true, false);
  10. //context.LineTo(new Point(500, 200), true, false);
  11. //context.LineTo(new Point(200, 100), true, false);
  12. }

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

真正绘图的对象

FrameworkElement并不提供任何绘制图形的能力,其只是为绘图提供了必要的数据.即自上而下的封装.
Rectangle=>Create RectangleGeometry=>调用DrawingContext的DrawRoundedRectangle
若不提供Geometry,DrawingContext内部则会再次创建Geometry.
WPF的元素就是通过一个个FrameworkElement结合DrawingContext为基础,结合WPF各项特性搭积木而成,所以性能不好的时候就请查看visual tree的数量吧.