首页 > 其他分享 >WPF绘图(一):几何(Geometry)与形状(Shape)

WPF绘图(一):几何(Geometry)与形状(Shape)

时间:2023-10-19 18:11:08浏览次数:42  
标签:几何图形 PathFigure Geometry PathGeometry Shape new WPF 属性

1. Geometry

在数学中,我们可以用一个方程描述圆:x2+y2=25。这个方程描述的是,一个半径为5,中心点在(0,0)的圆。这种纯数学的描述就是Geometry(几何)。

但此时,这个“圆”我们是看不见,摸不着的。如果想要看到这个几何图形,就必须用画笔,颜色等信息,去“绘制”它。

.Net中,Geometry类就是用于描述这种几何图形的类。它只包含描述几何图形的必要属性,并提供包括命中测试、动画等功能。它派生出以下七个类,以简化对图形的描述:

类名 功能
LineGeometry 直线
EllipseGeometry 椭圆(圆也是椭圆的一种)
RectangleGeometry 矩形
PathGeometry 路线(类似与随手画的一条任意线)
GeometryGroup 几何图形组(把多个几何图形放在一起)
CombinedGeometry 组合图形(将多个几何图形做布尔运算)
StreamGeometry 它是PathGeometry的轻量级对象。

1.1 LineGeometry

它表示一条直线。

它主要属性有EndPoint和StartPoint,用于定义直线的终点和起点。

Point start = new Point(0,0); 
Point end = new Point(50,50);
LineGeometry line = new LineGeometry(start,end);

1.2 EllipseGeometry

它表示一个椭圆(圆也是椭圆的一种)。

它主要属性有Center(中心点坐标)、RadiusX(x轴半径)、RadiusY(Y轴半径)。

Point center = new Point(50,50); 
EllipseGeometry ellipseGeo = new EllipseGeometry(center , 45, 20);

1.3 RectangleGeometry

它表示一个矩形(正方形也是矩形的一种)。

它主要属性有Rect(矩形框)、RadiusX(x轴半径)、RadiusY(y轴半径)。当定义了Rect属性后,RadiusX和RadiusY的值也就确定了;当给定了RadiusX和RadiusY的值,Rect属性的值也就确定了。

RectangleGeometry rect = new RectangleGeometry(10,20);

1.4 PathGeometry

它表示一条路线。这条路线中,可以有直线给,也可以有曲线。

它最重要的属性是Figures(路径图元),类型是PathFigureCollection,意味着它是一个集合,可以装载多个PathFigure对象。

PathFigure类,有一个重要的属性Segments,类型是PathSegmentCollection,意味着它也是一个集合,可以装载多个PathSegment(路径中的一部分)对象。

由此可见:多个Segment组成了一个PathSegmentCollection(PathFigure的Segment属性);多个PathFigure组成了一个PathFigureCollection(PathGeometry的PathFigure属性)。

// 定义SegmentCollection1 
LineSegment line1 = new(...); // 定义直线部分
PolyLineSegment pline1 = new (...); // 定义多段线部分
ArcSegment arc1 = new(...); // 定义弧形线段部分
PathSegmentCollection segments1 = new(new PathSegment[] { line1, pline1, arc1 }); // 定义PathSegment集合
PathFigure path1 = new(new Point(0, 0), segments1, false); // 定义第一个的PathFigure

// 定义SegmentCollection2
LineSegment line2 = new(...);
BezierSegment beszier = new(...); // 定义Bezier曲线部分
PathSegmentCollection segments2 = new(new PathSegment[] { line2, beszier });
PathFigure path2 = new(new Point(300, 0), segments2, false); // 定义第二个的PathFigure


// 定义PathFigureCollection
PathFigureCollection pathFigures = new(new PathFigure[] { path1, path2 });
PathGeometry pathGeo = new() { Figures = pathFigures }; // 定义PathGeometry


0

 备注:.Net提供“路径标记语法”用于简化PathFigures的创建。

1.5 GeometryGroup

它表示多个集合图形的集合。

它的主要属性有Children(包含的子图形),类型是GeometryCollection,意味着它可以可以装载多个Geometry对象。

LineGeometry lineGeo = new(); 
RectangleGeometry rectGeo = new(); 
PathGeometry pathGeo = new(); 
GeometryGroup geoGroup = new() { Children = new GeometryCollection() { lineGeo, rectGeo, pathGeo } };

GeometryGroup中的几何图形,也可以设置FillRule属性,以设置多个几何图形交叉区域的合并方式。

1.6 CombinedGeometry

它表示一个,由两个几何图形组合而成的图形。

它的主要属性有Geometry1(几何图形1)、Geometry2(几何图形2)、GeometryCombineMode(图形结合的方式)

RectangleGeometry rectGeo = new(); 
PathGeometry pathGeo = new(); 
CombinedGeometry CombineGeo = new(GeometryCombineMode.Exclude, rectGeo, pathGeo);

备注:

  • 该类的GeometryCombineMode指的是多个图形的“结合”方式,这种方式通常指的是布尔运算;而部分Geometry对象的FillRule,指的是交叠的图形的“填充”方式。指的是图形的重叠闭合区域的“填充”方式;
  • 虽然CombineGeometry只能“结合”两个Geometry对象。但是要注意,Geometry1和Geometry2的类型都是Geometry,意味只要只要是Geometry的子类,都可以赋值给这两个属性。因此,可以将多个Geometry填到GemetryGroup中,也可以两两CombinedGeometry,然后再将CombinedGeometry再CombinedGeometry。

1.7 StreamGeometry

它是PathGeometry的轻量级表示,不支持数据绑定、动画或修改。

这意味着,如果PathGeometry占用太多资源,且不需要数据绑定、动画、修改等功能,可以用StreamGeometry来替代。

它的工作原理是创建一个StreamGeometryContext对象,并在这个对象中绘制图形。所以,它没有图形数据相关的属性,

StreamGeometry streamGoe = new(); 
StreamGeometryContext context = streamGoe.Open(); 
context.ArcTo(...); // SteamGeometryContext类提供了多种绘图方法。 context.PolyLineTo(...); 
context.Close();

 2. Shape

形状(Shape),就是一个能看得到的几何图形。例如我们在白纸上,用红色的笔画一条直线,一个矩形。

由此可见,Shape的本质,就是在几何图形(Geometry)的基础上,加上画笔,颜色等信息,绘制而成。

.Net中,Shape就是表示“形状”的类。它是一个抽象类,继承自FrameworkElement,这意味着它是一个元素,可以直接显示在窗体上。

Shape类派生出了以下几个类:

类型 功能
Ellipse 椭圆形
Line 直线
Path 路径
Polygon 多边形
Polyline 多段线
Rectangle 矩形

这些类都比较容易使用,就不再一一赘述。

标签:几何图形,PathFigure,Geometry,PathGeometry,Shape,new,WPF,属性
From: https://www.cnblogs.com/raynado/p/17775333.html

相关文章

  • wpf TextBox复制文字卡顿 和迅雷的冲突
    迅雷会在后台一直监控读取用户剪切板,如果发现是下载格式,将会弹出下载框在wpf的TextBox中,快速按CtrlC会导致获取剪切板和设置剪切板的命令争抢引发System.Runtime.InteropServices.COMException这个异常通过查看源代码,发现在复制文字时,他们都不同情况的重试,暂停这可能就导致了......
  • 解决winform调用wpf窗体时原窗体缩小的问题
    在使用winform调用wpf窗体时,原来的winform窗体会缩小,同时分辨率会发生变化,用如下方法来解决这个问题。方法一、首先找到winform项目中的Properties ==>AssemblyInfo.cs,打开该文件,在末尾加入如下代码,之后重新运行即可。[assembly:System.Windows.Media.DisableDpiAwareness]/......
  • 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(10) -- 在Dat
    有时候,一些数据的录入可能需要使用表格直接录入会显得更加方便快捷,这种情况有时候也是由于客户使用习惯而提出,本篇随笔介绍在WPF应用端上使用DataGrid来直接新增、编辑、保存数据的处理。录入数据的时候,我们都采用在一个窗体界面中,根据不同内容进行录入,但是有时候涉及主从表的数......
  • 错误 NETSDK1136 如果使用 Windows 窗体或 WPF,或者引用使用 Windows 窗体或 WPF 的项
    背景:当同一解决方案的项目A引用项目B的时候出现引用异常 大概意思是项目A的框架类型是.net7.0,项目B的框架类型是net7.0-windows两者不兼容查看了连着的项目类型发现项目B是指定为Windows操作系统(注:建立类库项目B时没有指定操作系统,不知为啥显示指定了) 类库项目A是没指定......
  • WPF 编译出现大量系统文件
    .net版本号:.netframework4.6.1WPF编译后为什么会出现如下的系统文件,本身自带的框架应该是包含这些文件。查看这些DLL的版本都是隶属于4.6.2版本的 详细排查插件,发现某个插件最小支持4.6.2版本,本身是4.6.1,这才出现了许多DLL的原因。解决方法很简单:1.降插件的版本2.......
  • WPF性能优化:Freezable 对象
    Freezable是WPF中一个特殊的基类,用于创建可以冻结(Freeze)的可变对象。冻结一个对象意味着将其状态设置为只读,从而提高性能并允许在多线程环境中共享对象。Freezable的应用我们定义画刷资源的时候常常会这样写:<SolidColorBrushx:Key="RedBrush"Color="Red"o:Freeze="True"/>......
  • 界面组件DevExpress WPF v23.1 - 全面升级文档处理功能
    DevExpressWPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpressWPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。无论是Office办公软件的衍伸产品,还是以数据为中心......
  • WPF控件ItemsControl、ListBox、ListView、DataGrid、TreeView、TabControl用法及区别
    1.ItemsControltemsControl是WPF中最基本的控件之一,用于显示一个数据项集合。它允许按照自定义方式呈现任何类型的对象,可以在其中使用不同的布局和面板来展示数据。ItemsControl非常灵活,可以满足各种需求。以下是一个简单的ItemsControl的XAML示例,它使用StackPanel作为布局容器,......
  • 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(9) -- 实现系
    在WPF应用端开发,它的界面类似于Winform端,因此我们也需要对系统的菜单进行动态配置,这样才能把系统的功能弹性发挥到极致,通过动态菜单的配置方式,我们可以很容易的为系统新增所需的功能,通过权限分配的方式,可以更有效的管理系统的菜单分配到不同的角色用户,本篇随笔介绍在WPF应用端中实......
  • 无涯教程-NumPy - reshape函数
    此函数在不更改数据的情况下为数组提供了新的维度,它接受以下参数-numpy.reshape(arr,newshape,order')Sr.No.描述1arr数组2newshapeint或int的元组,新维度应与原始维度兼容3order如果数组存储在类似Fortran的连续内存中,则"C"表示C风格,"F"表示Fortran风格,"......