在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与StrokeThicknesspublic Brush Fill { get; set; }、public Brush Stroke { get; set; }与public System.Double StrokeThickness { get; set; }是Shape中最常用的三个属性,分别用于设置Shape的填充颜色、边框颜色、边框宽度。改变StrokeThickness并不会改变形状的大小。代码语言:javascript代码运行次数:0运行复制public Stretch Stretch { get; set; }用于确定形状如何填充可用的区域。Stretch的所有枚举值如下:None: 形状不被拉伸。Fill: 形状拉伸其宽度和高度,从而可以正好适应其容器。Uniform: 按比例改变形状的宽度和高度,直至形状到达容器板边缘。UniformToFill: 按比例改变形状的宽度和高度,直到形状填满了整个可用控件的高度和宽度。效果如下
代码语言:javascript代码运行次数:0运行复制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运行复制public PenLineCap StrokeDashCap { get; set; }表示虚线中实线两端的边缘轮廓。PenLineCap的枚举值如下:Flat: 一个未超出直线上最后一点的线帽。 等同于无线帽。Square: 一个高度等于直线粗细、长度等于直线粗细一半的矩形。Round: 一个直径等于直线粗细的半圆形。Triangle: 一个底边长度等于直线粗细的等腰直角三角形。代码语言:javascript代码运行次数:0运行复制public System.Double StrokeDashOffset { get; set; }用于指定虚线开始的位置。
2. Rectangle(矩形)Rectangle 只比Shape多了RadiusX和RadiusY两个属性。
2.1 RadiusX和RadiusYpublic 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运行复制
public PenLineJoin StrokeLineJoin { get; set; }和public System.Double StrokeMiterLimit { get; set; }确定形状拐角处的形状。这两个属性都是Shape的属性,但对Ellipse和Line这两个没有拐角的形状不起作用。
Line表示从第一个点(X1,Y1)到第二个点(X2,Y2)的一条直线。
3.1 X1,Y1,X2,Y2这四个属性确定了Line的起点和终点。
除了使用绝对值定位Line的位置,还可以使用相对定位。
代码语言:javascript代码运行次数:0运行复制public PenLineCap StrokeStartLineCap { get; set; }和public PenLineCap StrokeEndLineCap { get; set; }决定直线开始端和结束端的轮廓。这两个属性都是Shape的属性,但只影响Line、Polyline和Path,对Rectangle这类没有开始和结束端的形状没有影响。4. Polygon(多边形)和Polyline(折线)这两个形状具有相同的属性,外观也相似。区别只是如果Points的最后一个点和第一个点不一样,Polygon会自动将这两个点连接到一起。
4.1 Pointspublic PointCollection Points { get; set; }用于设置Polygon和Polyline的顶点。代码语言:javascript代码运行次数:0运行复制public FillRule FillRule { get; set; }指定如何确定形状的内部填充。默认值是EvenOdd,如果设置成Nonzero,效果如下:
Path是功能最强大的形状,它基本上由上面的其它形状组成并且可以替代它们中的任何一个。只是Path使用起来也比较复杂,只有在图表和少量场景用到,很多时候比起构造复杂的Path还不如用直接用图片。
5.1 Datapublic 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运行复制Path的XAML虽然具备很高的可读性,但在存储上不具优势。所以UWP提供了一种替代语法:图形微语言
。图形微语言使用一组简单的字符串描述Path的图形,一般来说不需要学习它的语法,因为通常它是由工具生成的。
通常用一个Path代替多个Shape不止更好管理,用户界面的性能也会更好。Blend里面提供了针对Shape的功能,可以对多个Shape进行合并或转换为路劲。
下面表格列出了Shape的各项属性,标记为“×”的属性代码这个属性对这个形状无效。
ViewBox是拉伸或缩放单个子元素的容器,最常用来搭配Shape(或文字)使用,因为Shape是矢量图形,放大后不会失真。
ViewBox有以下三个属性:
Child: 获取或设置 Viewbox 元素的单一子元素。Stretch: 获取或设置确定内容如何适合可用空间的 Stretch 模式。StretchDirection: 获取或设置确定缩放如何应用于 Viewbox 内容的 StretchDirection。代码语言:javascript代码运行次数:0运行复制系统地学过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
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。