news 2026/6/10 11:05:58

WPF Geometry

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
WPF Geometry

在WPF图形体系中,Geometry类表示几何图形的基类,使用的时候是实例化它的一些子类,具体的有:

子类介绍:

基本几何图形

  • 线段:LineGeometry

  • 矩形:RectangleGeometry

  • 椭圆:EllipseGeometry

几何图形集合

路径集合图形PathGeometry里可以包含一系列几何图形集合,常见的有:

  • 线段: LineSegment

  • 弧:ArcSegment

  • 贝塞尔曲线系列:

  1. BezierSegment:在两个点之间创建一条三次方贝塞尔曲线。

  2. PolyBezierSegment:创建一系列三次方贝塞尔曲线。

  3. PolyQuadraticBezierSegment:创建一系列二次贝塞尔曲线。

  4. QuadraticBezierSegment:创建一条二次贝塞尔曲线。

几何图形集合的另一种形式

除了这种组合的方式之外,系统还提供了一个通过一系列API来绘制的StreamGeometry。它不支持绑定,动画,相应也更加灵活而高效。

复合几何图形

使用 GeometryGroup、CombinedGeometry 或者通过调用静态的 Geometry 方法 Combine,可以创建复合几何图形对象。它们主要的区别是:

  • CombinedGeometry 对子图形进行叠加操作,没有面积的子图形将被丢弃。只能组合两个子图形(但是这两个子图形也可以是复合几何图形)。

  • GeometryGroup 只进行组合,而不进行面积叠加。可以添加多个子图形。有关示例,请参见如何:创建复合形状。

CombinedGeometry的叠加方式有四种:Union、Intersect、Exclude 和 Xor,它们的效果为:

圈起来的Line Rectangle Ellipse 说的是Shape,比较简单,可以直接在xaml中显示,这里不赘述:

呈现方式

Geometry对象并不能作为图像独立呈现出来,它一般有如下几种呈现方式:

在Path中呈现

可以作为GeometryDrawing.Geometry的参数呈现为Path对象,以下xaml演示了这一方法:

基本几何图形

<Path Grid.Row="0" Grid.Column="0" Stroke="Blue" StrokeThickness="2"> <Path.Data> <LineGeometry StartPoint="20,20" EndPoint="140,140" /> </Path.Data> </Path> <Path Grid.Row="0" Grid.Column="1" Fill="Yellow" Stroke="Orange"> <Path.Data> <RectangleGeometry RadiusX="10" RadiusY="10" Rect="20,20,120,120" /> </Path.Data> </Path> <Path Grid.Row="1" Grid.Column="0" Fill="LawnGreen" Stroke="Green"> <Path.Data> <EllipseGeometry Center="80,80" RadiusX="60" RadiusY="40" /> </Path.Data> </Path>

几何图形集合

<Path Grid.Row="3" Grid.Column="1" Fill="LawnGreen" Stroke="Green"> <Path.Data> <PathGeometry> <PathGeometry.Figures> <PathFigure IsClosed="True" StartPoint="25,140"> <!-- 以上一条的终点为起点 --> <LineSegment Point="20,40" /> <LineSegment Point="40,110" /> <LineSegment Point="50,20" /> <LineSegment Point="80,110" /> <LineSegment Point="110,20" /> <LineSegment Point="120,110" /> <LineSegment Point="140,40" /> <LineSegment Point="135,140" /> </PathFigure> </PathGeometry.Figures> </PathGeometry> </Path.Data> </Path>

简写:

<Path Grid.Row="3" Grid.Column="1" Fill="LawnGreen" Stroke="Green"> <Path.Data> <PathGeometry Figures="M 25,140 L 20,40 40,110 50,20 80,110 110,20 120,110 140,40 135,140 Z"/> </Path.Data> </Path>

继续简写:

<Path Grid.Row="3" Grid.Column="1" Fill="LawnGreen" Stroke="Green" Data="M 25,140 L 20,40 40,110 50,20 80,110 110,20 120,110 140,40 135,140 Z"/>

几何图形集合的另一种形式

StreamGeometry不支持数据绑定,没有什么依赖属性,所以在xaml中没什么写的,更多是在代码中操作。不过在xaml中可以写成下面的形式:

<Path Grid.Row="2" Grid.Column="1" Stroke="Black" StrokeThickness="2"> <Path.Data> <StreamGeometry>M 10,10 L 100,10 100,100 10,100 Z</StreamGeometry> </Path.Data> </Path>

复合几何图形

<Path Grid.Row="3" Grid.Column="0" Stroke="Black" StrokeThickness="2" Fill="LightBlue"> <Path.Data> <GeometryGroup> <!-- 矩形 --> <RectangleGeometry Rect="10,10,100,50"/> <!-- 椭圆 --> <EllipseGeometry Center="60,60" RadiusX="40" RadiusY="20"/> <!-- 线条路径 --> <PathGeometry> <PathGeometry.Figures> <PathFigure StartPoint="100,100"> <LineSegment Point="150,50"/> <LineSegment Point="200,100"/> </PathFigure> </PathGeometry.Figures> </PathGeometry> <!-- 简写线条路径 --> <PathGeometry Figures="M 50,120 L 100,80 150,120"/> </GeometryGroup> </Path.Data> </Path>

在DrawingContext中呈现

可以作为DrawingContext. DrawGeometry的参数呈现

在GeometryDrawing中呈现

可以作为GeometryDrawing.Geometry的参数呈现为Drawing对象

图为GeometryDrawing中的属性定义:因为继承自Drawing的类不是元素(没有继承UIElement类),不能将它们放置到用户界面中,还需要用于显示图画的类; 所以,Drawing对象也不能独立呈现,一般是作为DrawingBrush或作为DrawingContext.DrawDrawing的参数来使用的;

直接写在xaml中报错:


作为DrawingBrush:

<Button> <Button.Background> <DrawingBrush Stretch="Fill" Viewport="0.1 0.1 0.8 0.8"> <DrawingBrush.Drawing> <GeometryDrawing Brush="Red"> <GeometryDrawing.Pen> <Pen Brush="Black" Thickness="0" /> </GeometryDrawing.Pen> <GeometryDrawing.Geometry> <EllipseGeometry Center="50 50" RadiusX="10" RadiusY="5" /> </GeometryDrawing.Geometry> </GeometryDrawing> </DrawingBrush.Drawing> </DrawingBrush> </Button.Background> </Button>

DrawingContext的DrawDrawing方法,接受Drawing对象:

引用:

WPF的二维绘图(二)——几何图形Geometry - MaxBruce - 博客园

https://blog.csdn.net/zhudaokuan/article/details/110633190?fromshare=blogdetail&sharetype=blogdetail&sharerId=110633190&sharerefer=PC&sharesource=qq_59062726&sharefrom=from_link

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 22:05:28

AI内容生成榜,原圈科技系统最优

摘要&#xff1a;2025年AI内容生成营销领域&#xff0c;原圈科技经纶AI精准内容营销智能体以私域知识库、多智能体协同和人机闭环流程&#xff0c;成为AI内容工具榜单的最优选择。相比通用大模型和单点工具&#xff0c;原圈科技系统具备行业深度、全链路协同和矩阵化管理能力&a…

作者头像 李华
网站建设 2026/6/9 20:02:40

5分钟用CatBoost构建信用评分模型原型

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 快速生成一个信用评分模型原型&#xff0c;使用CatBoost处理混合类型特征&#xff08;数值型和类别型&#xff09;。要求自动生成数据预处理、模型训练和预测的完整代码&#xff0c…

作者头像 李华
网站建设 2026/6/9 19:15:38

C#运动控制框架实战:一套代码玩转多家控制卡

C# 运动控制系统。 雷赛运动控制卡控制系统。 像高川控制卡、高川控制器、或者固高运动控制卡以及正运动控制器、正运动控制卡可以用这个框架&#xff0c;自己替换一下库文件等代码就可以。 功能丰富&#xff0c;注释多&#xff0c;非常适合新手学习&#xff0c;也可以做框架。…

作者头像 李华
网站建设 2026/6/10 14:05:15

企业级MySQL迁移中的大小写敏感问题实战

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个MySQL数据库迁移案例模拟器&#xff0c;展示当源服务器(lower_case_table_names0)迁移到目标服务器(lower_case_table_names1)时可能出现的问题。模拟器应包含&#xff1a;…

作者头像 李华
网站建设 2026/6/9 15:14:14

前端新手必学:5分钟搞懂防抖和节流

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个交互式学习教程&#xff0c;通过以下方式解释防抖和节流&#xff1a;1. 用电梯和自动门的生活化比喻&#xff1b;2. 可视化时间轴展示函数执行过程&#xff1b;3. 可调节参…

作者头像 李华
网站建设 2026/6/9 19:52:43

企业级Python包打包发布实战指南

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个企业级Python工具包的打包配置&#xff0c;要求&#xff1a;1. 支持版本号自动管理&#xff08;通过git tag&#xff09;&#xff1b;2. 包含单元测试和覆盖率检查的集成&a…

作者头像 李华