[UWP]实用的Shape指南


在uwp ui系统中,使用shape是绘制2d图形最简单的方式,小到图标,大到图表都用到shape的派生类,可以说有举足轻重的地位。幸运的是从silverlight以来shape基本没有什么大改动,简直是uwp中的一股清流。

上图来自Pro Silverlight 5 in C#,可见Silverlight中的Shape和UWP的Shape基本架构一致。Shape的API从WPF以来就几乎没变,对熟悉WPF/Silverlight的开发者来说几乎是零学习成本。

1. Ellipse(圆形)

Ellipse没有在Shape的基础上增加任何属性,是Shape的派生类中最简单的一个。

1.1 Fill、Stroke与StrokeThickness

public Brush Fill { get; set; }
public Brush Stroke { get; set; }
public System.Double StrokeThickness { get; set; }
是Shape中最常用的三个属性,分别用于设置Shape的填充颜色、边框颜色、边框宽度。改变StrokeThickness并不会改变形状的大小。

代码语言:javascript代码运行次数:0运行复制
1.2 Stretch

public Stretch Stretch { get; set; }
用于确定形状如何填充可用的区域。Stretch的所有枚举值如下:

None: 形状不被拉伸。Fill: 形状拉伸其宽度和高度,从而可以正好适应其容器。Uniform: 按比例改变形状的宽度和高度,直至形状到达容器板边缘。UniformToFill: 按比例改变形状的宽度和高度,直到形状填满了整个可用控件的高度和宽度。

效果如下

代码语言:javascript代码运行次数:0运行复制
                
1.3 StrokeDashArray

public DoubleCollection StrokeDashArray { get; set; }用于将边框变成虚线。StrokeDashArray的值是一个double类型的有序集合,集合中的值指虚线中每一段的长度,长度单位是边框值的宽度。例如以下圆形:

代码语言:javascript代码运行次数:0运行复制

边框宽度为10,虚线的第一段是长度为10的实线,第二段为长度为20的空白,第三段为长度为30的实线,然后如此循环直到结束。

自从开始WPF工作以来,我一直将StrokeDashArray的值设为一个好看又好记的值:4 2,the answer to life, the universe, and everything。

代码语言:javascript代码运行次数:0运行复制
1.4 StrokeDashCap

public PenLineCap StrokeDashCap { get; set; }
表示虚线中实线两端的边缘轮廓。PenLineCap的枚举值如下:

Flat: 一个未超出直线上最后一点的线帽。 等同于无线帽。Square: 一个高度等于直线粗细、长度等于直线粗细一半的矩形。Round: 一个直径等于直线粗细的半圆形。Triangle: 一个底边长度等于直线粗细的等腰直角三角形。代码语言:javascript代码运行次数:0运行复制
                
1.5 StrokeDashOffset

public System.Double StrokeDashOffset { get; set; }用于指定虚线开始的位置。

2. Rectangle(矩形)

Rectangle 只比Shape多了RadiusX和RadiusY两个属性。

2.1 RadiusX和RadiusY

public System.Double RadiusX { get; set; }和public System.Double RadiusY { get; set; }分别用于指定用于使矩形的角变圆的椭圆的x轴和 y轴半径。

如下面这个例子,可以看到

 RadiusX="50" RadiusY="20"
的Rectangle的圆角和
Width="100" Height="40"
的Ellipse(x轴半径50,y轴半径20)完全重合在一起。

代码语言:javascript代码运行次数:0运行复制
2.2 StrokeLineJoin和StrokeMiterLimit

public PenLineJoin StrokeLineJoin { get; set; }
public System.Double StrokeMiterLimit { get; set; }
确定形状拐角处的形状。这两个属性都是Shape的属性,但对Ellipse和Line这两个没有拐角的形状不起作用。

3. Line(直线)

Line表示从第一个点(X1,Y1)到第二个点(X2,Y2)的一条直线。

3.1 X1,Y1,X2,Y2

这四个属性确定了Line的起点和终点。

除了使用绝对值定位Line的位置,还可以使用相对定位。

代码语言:javascript代码运行次数:0运行复制
3.2 StrokeStartLineCap与StrokeEndLineCap

public PenLineCap StrokeStartLineCap { get; set; }
public PenLineCap StrokeEndLineCap { get; set; }
决定直线开始端和结束端的轮廓。这两个属性都是Shape的属性,但只影响Line、Polyline和Path,对Rectangle这类没有开始和结束端的形状没有影响。

4. Polygon(多边形)和Polyline(折线)

这两个形状具有相同的属性,外观也相似。区别只是如果Points的最后一个点和第一个点不一样,Polygon会自动将这两个点连接到一起。

4.1 Points

public PointCollection Points { get; set; }
用于设置Polygon和Polyline的顶点。

代码语言:javascript代码运行次数:0运行复制
4.2 FillRule

public FillRule FillRule { get; set; }
指定如何确定形状的内部填充。默认值是EvenOdd,如果设置成Nonzero,效果如下:

5 Path(路径)

Path是功能最强大的形状,它基本上由上面的其它形状组成并且可以替代它们中的任何一个。只是Path使用起来也比较复杂,只有在图表和少量场景用到,很多时候比起构造复杂的Path还不如用直接用图片。

5.1 Data

public Geometry Data { get; set; }
属性指定要绘制形状的Geometry。Geometry 定义几何图形并且定义了坐标和尺寸等细节 ,由Path绘制到屏幕。UWP中的Geometry包含以下几个:

EllipseGeometry: 表示圆或椭圆的几何图形。LineGeometry: 表示线条的几何图形。PathGeometry: 表示一个可能由弧、曲线、椭圆、直线和矩形组成的基于矢量的复杂形状。RectangleGeometry: 描述二维矩形这一几何图形。

除此之外,还可以使用由多个Geometry组成的GeometryGroup构造组合形状。

5.2 PathGeometry

在所有Geometry中PathGeometry是功能最强大的,唯一的缺点是太多复杂。它使用

public PathFigureCollection Figures { get; set; }
描述包含的图形内容,PathFigure由PathSegment的派生类描述,包括:

ArcSegment: 表示两点之间的一条椭圆弧。BezierSegment: 表示在两个点之间绘制的一条三次贝塞尔曲线。LineSegment: 表示在两个点之间绘制的一条线,它可能是 PathFigure 在 Path 数据内的一部分。PolyBezierSegment: 表示一条或多条三次方贝塞尔曲线。PolyLineSegment: 表示由 Point 集合定义的一组线段,每个 Point 指定一个线段的终点。PolyQuadraticBezierSegment: 表示一系列二次贝塞尔线段。QuadraticBezierSegment: 在 PathFigure 中的两点之间创建二次贝塞尔曲线。

下面是一个Path的官方示例,同时使用了各种Geometry及部分PathSegment:

代码语言:javascript代码运行次数:0运行复制
                                                                                                                                                                                                                                                                                                                                                                                                                        
5.3 图形微语言(geometry mini-language)

Path的XAML虽然具备很高的可读性,但在存储上不具优势。所以UWP提供了一种替代语法:图形微语言。图形微语言使用一组简单的字符串描述Path的图形,一般来说不需要学习它的语法,因为通常它是由工具生成的。

代码语言:javascript代码运行次数:0运行复制
5.4 使用Blend

通常用一个Path代替多个Shape不止更好管理,用户界面的性能也会更好。Blend里面提供了针对Shape的功能,可以对多个Shape进行合并或转换为路劲。

6. Shape各项属性比较

下面表格列出了Shape的各项属性,标记为“×”的属性代码这个属性对这个形状无效。

7. ViewBox

ViewBox是拉伸或缩放单个子元素的容器,最常用来搭配Shape(或文字)使用,因为Shape是矢量图形,放大后不会失真。

ViewBox有以下三个属性:

Child: 获取或设置 Viewbox 元素的单一子元素。Stretch: 获取或设置确定内容如何适合可用空间的 Stretch 模式。StretchDirection: 获取或设置确定缩放如何应用于 Viewbox 内容的 StretchDirection。代码语言:javascript代码运行次数:0运行复制
                                                                        
8. 结语

系统地学过Shape相关知识只在很多年前刚开始学WPF/Silverlight时做过,平时除了Rectangle和Line其他的Shape好少会用到,所以即使有多年经验对Shape的很多知识点还是有点陌生,这次趁学习UWP的机会复习一下。

但因为很多知识点平时就很少会用到,后面越写越腻味。

9. 参考

绘制形状 Windows.UI.Xaml.Shapes 命名空间 Windows.UI.Xaml.Media 命名空间


# windows  # 工具  # 区别  # c#  # 相对定位  # silver  # JavaScript  # 架构  # 命名空间  # 字符串  # double  # 循环  # public  # wpf  # ui  # everything  # 这两个  # 多个  # 塞尔  # 都是  # 是一个  # 还可以  # 第一个  # 长度为  # 最简单  # 两点 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: Go 中实现 Python urllib.quote() 等效功能的正确方式  Win11怎样安装剪映专业版_Win11安装剪映教程【步骤】  Mac怎么给文件夹加密_Mac创建加密磁盘映像教程【安全】  PythonDocker高级项目部署教程_多容器管理与CI/CD流水线  Windows 11如何开启文件夹加密(EFS)_Windows 11文件属性中加密内容以保护数据  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?  Win11怎么更改电脑名称_Windows 11修改计算机名操作指南【步骤】  Win11怎么修复系统文件_使用sfc命令修复Win11系统【技巧】  Mac如何备份到iCloud_Mac桌面与文稿文件夹云同步【设置】  c++怎么使用std::filesystem遍历文件夹_c++ 递归查找文件与权限修改【技巧】  Windows蓝屏错误0x00000018怎么处理_驱动初始化错误解决  XSLT怎么生成动态的HTML属性名和标签名  Linux如何安装Tomcat应用服务器_Linux环境部署与端口修改【教程】  使用类变量定义字符串常量时如何实现类型安全的 Literal 注解  Windows服务无法启动错误1067是什么_进程意外终止的解决方法  Win11怎么更改任务栏颜色_Windows11个性化重音色设置  Python抽象类与接口设计_规范说明【指导】  Mac的访达(Finder)怎么用_Mac文件管理入门教程【详解】  c++的mutex和lock_guard如何使用 互斥锁保护共享资源【多线程】  PHP主流架构怎么监控运行状态_工具推荐【操作】  Python与Docker容器化部署实战_镜像构建与CI/CD流程  如何关闭Win10自动更新更新_Win10系统自动更新双重关闭技巧  Win11怎么开启上帝模式_创建Windows 11 God Mode全能文件夹【技巧】  Win11任务栏怎么固定应用 Win11将软件图标固定到底部【步骤】  php删除数据怎么软删除_添加is_del字段标记删除【技巧】  php485返回数据不完整怎么办_php485数据分包重组处理方法【教程】  如何在JavaScript中动态拼接PHP的base_url与JS变量  Win11怎么禁用键盘自带键盘_Win11笔记本禁用内置键盘方法【教程】  c++怎么调用nana库开发GUI_c++ 现代风格窗口组件与事件处理【实战】  Win11怎么设置右键刷新选项_Windows11显示更多选项技巧  VSC怎样在VSC中调试PHPAPI_接口调试技巧【详解】  Windows10蓝屏代码DPC_WATCHDOG_VIOLATION_Win10死机修复指南  Windows7如何安装系统镜像_Windows7系统安装教程【步骤】  php串口通信波特率怎么选_根据硬件手册设置正确波特率【方法】  Win11怎么开启远程桌面_Win11系统远程桌面启用开关  Win11开机自检怎么关闭_跳过Win11开机磁盘扫描修复方法【技巧】  Mac系统更新下载慢或失败怎么办_解决macOS升级问题【方法】  php中作用域操作符能访问私有静态属性吗_访问权限限制【指南】  Win11怎么关闭内容自适应亮度_Windows11显示设置CABC关闭  PHP cURL GET请求:正确设置请求头与身份认证的完整教程  Win11怎么关闭键盘按键音_Win11禁用打字声音反馈【教程】  mac怎么看硬盘大小_MAC查看磁盘存储空间与文件占用【详解】  如何使用正则表达式批量替换重复的 *- 模式为固定字符串  Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件  php中self::能调用子类重写的方法吗_静态绑定与重写关系【介绍】  mac本地php环境如何开启curl_curl扩展启用与测试步骤详解【汇总】  mac怎么右键_MAC鼠标右键设置与触控板手势技巧【入门】  PythonGIL机制理解_多线程限制解析【教程】  如何在Golang中处理云原生事件_使用Event和Notification机制  PHP接收参数值为空怎么办_判断和处理空参数方法说明【说明】 

 2025-08-21

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.