WPF中如何设置自定义控件(二)
前一篇文章中简要讲解了圆角按钮、圆形按钮的使用,以及在windows.resource和app.resource中设置圆角或圆形按钮的样式。
这篇主要讲解Polygon(多边形)、Ellipse(椭圆)、Path(路径)这三个内容。
Polygon
我们先看一下的源码:
namespace System.Windows.Shapes
{
public sealed class Polygon : Shape
{
public static readonly DependencyProperty PointsProperty = DependencyProperty.Register("Points", typeof(PointCollection), typeof(Polygon), new FrameworkPropertyMetadata((object)new FreezableDefaultValueFactory((Freezable)PointCollection.get_Empty()), FrameworkPropertyMetadataOptions.AffectsMeasure | FrameworkPropertyMetadataOptions.AffectsRender));
public static readonly DependencyProperty FillRuleProperty = DependencyProperty.Register("FillRule", typeof(FillRule), typeof(Polygon), (PropertyMetadata)new FrameworkPropertyMetadata(FillRule.EvenOdd, FrameworkPropertyMetadataOptions.AffectsMeasure | FrameworkPropertyMetadataOptions.AffectsRender), (ValidateValueCallback)ValidateEnums.IsFillRuleValid);
private Geometry _polygonGeometry;
public PointCollection Points
{
get
{
return (PointCollection)GetValue(PointsProperty);
}
set
{
SetValue(PointsProperty, value);
}
}
public FillRule FillRule
{
get
{
return (FillRule)GetValue(FillRuleProperty);
}
set
{
SetValue(FillRuleProperty, value);
}
}
protected override Geometry DefiningGeometry => _polygonGeometry;
internal override void CacheDefiningGeometry()
{
PointCollection points = Points;
PathFigure pathFigure = new PathFigure();
if (points == null)
{
_polygonGeometry = Geometry.Empty;
return;
}
if (points.Count > 0)
{
pathFigure.StartPoint = points[0];
if (points.Count > 1)
{
Point[] array = new Point[points.Count - 1];
for (int i = 1; i < points.Count; i++)
{
array[i - 1] = points[i];
}
pathFigure.Segments.Add(new PolyLineSegment(array, isStroked: true));
}
pathFigure.IsClosed = true;
}
PathGeometry pathGeometry = new PathGeometry();
pathGeometry.Figures.Add(pathFigure);
pathGeometry.FillRule = FillRule;
_polygonGeometry = pathGeometry;
}
}
}
从源码的信息可以看到Polygon是继承自Shape的类,可用的属性只有PointsProperty、FillRuleProperty两个属性;PointsProperty是PointCollection的Point集合,而Point实质就是一个二维坐标集合,因此在Polygon的使用中Points的中的数据必须是2N个。用法如下:
<Polygon Points="100,400 200,370 180,470" Fill="#4EB1B6" /><!--多边形-->
效果图:

Ellipse
源码如下:
namespace System.Windows.Shapes
{
public sealed class Ellipse : Shape
{
private Rect _rect = Rect.Empty;
public override Geometry RenderedGeometry => DefiningGeometry;
public override Transform GeometryTransform => Transform.Identity;
protected override Geometry DefiningGeometry
{
get
{
if (_rect.IsEmpty)
{
return Geometry.Empty;
}
return new EllipseGeometry(_rect);
}
}
internal override int EffectiveValuesInitialSize => 13;
static Ellipse()
{
Shape.StretchProperty.OverrideMetadata(typeof(Ellipse), new FrameworkPropertyMetadata(Stretch.Fill));
}
protected override Size MeasureOverride(Size constraint)
{
if (base.Stretch == Stretch.UniformToFill)
{
double width = constraint.Width;
double height = constraint.Height;
if (double.IsInfinity(width) && double.IsInfinity(height))
{
return GetNaturalSize();
}
width = ((!double.IsInfinity(width) && !double.IsInfinity(height)) ? Math.Max(width, height) : Math.Min(width, height));
return new Size(width, width);
}
return GetNaturalSize();
}
protected override Size ArrangeOverride(Size finalSize)
{
double strokeThickness = GetStrokeThickness();
double num = strokeThickness / 2.0;
_rect = new Rect(num, num, Math.Max(0.0, finalSize.Width - strokeThickness), Math.Max(0.0, finalSize.Height - strokeThickness));
switch (base.Stretch)
{
case Stretch.None:
{
double num4 = (_rect.Width = (_rect.Height = 0.0));
break;
}
case Stretch.Uniform:
if (_rect.Width > _rect.Height)
相关文章:
WPF中如何设置自定义控件(二)
前一篇文章中简要讲解了圆角按钮、圆形按钮的使用,以及在windows.resource和app.resource中设置圆角或圆形按钮的样式。 这篇主要讲解Polygon(多边形)、Ellipse(椭圆)、Path(路径)这三个内容。 Polygon 我们先看一下的源码: namespace System.Windows.Shapes { pu…...
【C++】每周一题——2024.3.3
题目 Cpp 【问题描述】 字符环(来源:NOI题库)。有两个由字符构成的环,请写一个程序,计算这两个字符环上最长公共字符串的长度。例如,字符串“ABCEFAGADEGKABUVKLM”的首尾连在一起,构成一个环&a…...
5G网络架构与组网部署01--5G网络架构的演进趋势
目录 1. 5G网络架构的演进趋势 1.1 5G移动通信系统整体架构 1.2 4G移动通信系统整体架构 1.3 4G与5G移动通信系统整体架构对比 1.4 核心网架构演进 1.5 无线接入网演进 1. 整体架构组成:接入网,核心网 2. 5G网络接入网和核心网对应的网元ÿ…...
2023全球软件开发大会-上海站:探索技术前沿,共筑未来软件生态(附大会核心PPT下载)
随着信息技术的迅猛发展,全球软件开发大会(QCon)已成为软件行业最具影响力的年度盛会之一。2023年,QCon再次来到上海,汇聚了众多业界精英、技术领袖和开发者,共同探讨软件开发的最新趋势和实践。 一、大会…...
C#插入排序算法
插入排序实现原理 插入排序算法是一种简单、直观的排序算法,其原理是将一个待排序的元素逐个地插入到已经排好序的部分中。 具体实现步骤如下 首先咱们假设数组长度为n,从第二个元素开始,将当前元素存储在临时变量temp中。 从当前元素的前一…...
快速搭建Vue前端框架
快速搭建Vue前端框架 安装Vue Vue官方安装过程:https://cli.vuejs.org/zh/guide/installation.html 二.创建Vue工程 2.2 安装淘宝镜像 安装淘宝镜像(会让你安装Vue的速度加快): npm config set registry https://registry.npm.taobao.or…...
TS中private和protected的区别
在 TypeScript 中,private 和 protected 是两种访问修饰符,用于限制类成员(如属性、方法等)的可见性和可访问性。它们的主要区别在于访问权限的宽松程度。 1. private 当一个类的成员被标记为 private 时,它只能在该…...
虚拟机Hyper-V操作记录
问题1:安装Hyper-V,虚拟机监控程序无法打钩,提示该固件的虚拟化支持被禁用 主板型号:华硕ASUS ROG STRIX Z390-E GAMING 解决方法:进入BIOS,Advanced/CPU Configuration/Intel(VMX) Virtualization Technol…...
90. 子集 II(力扣LeetCode)
文章目录 90. 子集 II题目描述回溯算法 90. 子集 II 题目描述 给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 …...
202435读书笔记|《半小时漫画中国史》——读点经济学与历史,生活更美好,趣味烧脑土地制度、商鞅变法、华丽丽的丝绸之路这里都有
202435读书笔记|《半小时漫画中国史》——读点经济学与历史,生活更美好,趣味烧脑土地制度、商鞅变法、华丽丽的丝绸之路这里都有 1. 土地政策、度量衡及税收2. 商鞅变法3. 西汉经济4. 西汉盐铁大辩论5. 西汉丝绸之路 《半小时漫画中国史:经济…...
2023下半年主品牌锋芒依旧,江南布衣打破既定天花板?
在过去的2023年里,服装板块令人意外的领涨消费大盘,国家统计局数据显示,上半年服装零售额同比增长12.8%,远超商品零售大盘的增速6.8%。 整体表现强劲的同时,“局部”表现是否也尽如人意。近日,作为时尚服装…...
Gitlab: PHP项目CI/CD实践
目录 1 说明 2 CI/CD 2.1 部署方式一:增量部署 2.1.1 目标服务器准备 2.2.2 Gitlab及Envoy脚本 2.2 部署方式二:镜像构建与部署 2.2.1 推送到私有化容器仓库 准备工作 脚本 要点 2.2.2 推送到hub.docker.com 准备工作 脚本 3 参考&#x…...
c语言游戏实战(10):坤坤的篮球回避秀
前言: 这款简易版的球球大作战是博主耗时两天半完成的,玩家需要控制坤坤在游戏界面上移动,来躲避游戏界面上方不断掉下来的篮球。本游戏使用C语言和easyx图形库编写,旨在帮助初学者了解游戏开发的基本概念和技巧。 在开始编写代…...
初学arp欺骗
首先准备一台靶机这里用虚拟机的win10 已知网关与ip地址(怕误伤) 现在返回kali从头开始 首先探测自己的网关 然后扫内网存活的ip 发现有3台 用nmap扫一下是哪几台 成功发现我们虚拟机的ip 现在虚拟机可以正常访问网络 接下来直接开梭 ip网关 返回虚拟机…...
ftp几个常见错误问题及解决办法
1、无法上传网页,FTP故障-提示“无法连接服务器”错误。 问题出现原因:FTP客户端程序设置问题,客户上网线路问题,ftp服务器端问题。 处理方法:建议客户使用CUTPFTP软件来上传客户的网页,在“F…...
鸿蒙App开发新思路:小程序转App
国家与国家之间错综复杂,在谷歌的安卓操作系统“断供”后,鸿蒙系统的市场化&独立化的道路便显而易见了。 2024年1月18日,华为宣布,不再兼容安卓的“纯血鸿蒙”--HarmonyOS NEXT鸿蒙星河版最终面世,并与2024年Q4正…...
C++17之std::invoke: 使用和原理探究(全)
C进阶专栏:http://t.csdnimg.cn/5mV9r 目录 1.概述 2.辅助类 3.原理分析 4.总结 1.概述 在之前的 C 版本中,要调用不同类型的可调用对象,需要使用不同的语法,例如使用函数调用运算符 () 来调用函数或函数指针,使用…...
shadertoy 游戏《来自星尘》摇杆复刻
正确的做法应该是上 noise 而不是叠加 sin 波,不过如果不想麻烦的话叠波还是一个不错的选择:整体效果如下,已经非常形似 直接上链接:Shader - Shadertoy BETA float radiusScale 0.9; float variation(vec2 v1, vec2 v2, float …...
获取PDF中的布局信息——如何获取段落
PDF解析是极其复杂的问题。不可能靠一个工具解决全部问题,尤其是五花八门,格式不统一的PDF文件。除非有钞能力。如果没有那就看看可以分为哪些问题。 提取文本内容,提取表格内容,提取图片。我认为这些应该是分开做的事情。python有…...
Laya2.13.3在Web条件下使用键盘控制相机移动
需求:在Laya开发时,常常没法移动相机来观察场内的环境,故制作一个移动相机的脚本来是实现此功能,目前先使用键盘后续会添加鼠标控制移动旋转等功能。 onEnable(){this.camera new Laya.Camera(0, 0.1, 100);this._tempVector3 n…...
智能指挥官 · 用 Multi-Agent 编排让 AI 团队自己干活
🧑💻 博主介绍 & 诚邀关注 作者:专注于 Java、Python、前端开发的技术博主 | 全网粉丝 30 万 在校期间协助导师完成毕业设计课题分类、论文格式初审及代码整理工作;工作后持续分享毕设思路,助力毕业生顺利完成…...
2026年,揭秘浙江废铝回收界的明星企业!
引言:废铝回收,绿色循环的先锋随着我国经济的快速发展和工业生产的不断扩大,废铝回收行业逐渐成为资源循环利用的重要环节。在浙江省,众多废铝回收企业脱颖而出,其中腾兰再生资源回收有限公司以其卓越的表现࿰…...
【Elasticsearch从入门到精通】第06篇:Elasticsearch重要系统参数设置——防止启动检查失败
上一篇【第05篇】Elasticsearch配置详解——config.yml核心配置项全解析 下一篇【第07篇】Elasticsearch集群安全配置 摘要 将Elasticsearch部署到生产环境时,操作系统层面的参数配置往往是被忽视的关键环节。ES通过Bootstrap Checks机制在启动时强制检测这些参数&…...
Unity+C#开发万人MMO服务器的实战架构与同步优化
1. 这不是“写个服务器”那么简单:先撕开“万人在线”的真实含义很多人看到“UnityC#开发万人MMO服务器”这个标题,第一反应是:“哦,用Unity做客户端,C#写个后端,Socket连一连,再加个数据库&…...
Unity UGUI Mask与3D对象Stencil裁剪失效的根因解析
1. 这不是“Stencil失效”,而是 Unity 渲染管线里一场被忽略的层级静默冲突 你有没有试过在 UGUI ScrollView 里放一个带 Mask 的滚动区域,再把一个 3D 模型(比如一个带透明材质的粒子特效、或者一个半透的 UI 面板)叠在它上面&am…...
Unity游戏AI入门:从状态机到寻路的实战指南
1. 这不是“AI”,是游戏里会呼吸的NPC——从Unity初学者视角重新理解“游戏AI” 很多人点开“Unity 游戏 AI”教程,第一反应是:是不是要学TensorFlow、调大模型、搞深度强化学习?我试过三次,每次都在导入PyTorch插件时…...
告别键盘连击烦恼:Keyboard Chatter Blocker终极使用指南
告别键盘连击烦恼:Keyboard Chatter Blocker终极使用指南 【免费下载链接】KeyboardChatterBlocker A handy quick tool for blocking mechanical keyboard chatter. 项目地址: https://gitcode.com/gh_mirrors/ke/KeyboardChatterBlocker 你是否经常在打字时…...
2026年6月护腰带:专业制造商怎么选?
2026年6月,护腰带源头厂家推荐衡水凤宇医疗器械有限公司早上八点,刚坐上工位的李哥下意识地揉了揉后腰——又是一个硬板凳撑满八小时的日常。自从去年查出腰肌劳损,他试过理疗贴膏,试过网购几十块的护腰,结果要么闷汗起…...
Mac Mouse Fix终极指南:将普通鼠标打造成专业级触控板体验
Mac Mouse Fix终极指南:将普通鼠标打造成专业级触控板体验 【免费下载链接】mac-mouse-fix Mac Mouse Fix - Make Your $10 Mouse Better Than an Apple Trackpad! 项目地址: https://gitcode.com/GitHub_Trending/ma/mac-mouse-fix Mac Mouse Fix是一款专为…...
Taotoken 多模型聚合能力如何赋能智能客服场景的快速迭代
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 Taotoken 多模型聚合能力如何赋能智能客服场景的快速迭代 智能客服系统的核心在于其对话生成的质量与稳定性。产品经理与开发者在优…...
