[WPF] 继承Shape实现弧形、扇形控件
时间:2021-07-14
本文章向大家介绍[WPF] 继承Shape实现弧形、扇形控件,主要包括[WPF] 继承Shape实现弧形、扇形控件使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
属性:
RadianStart:开始弧度,默认值-90,即从最上面开始顺时针画。
Radian:弧度,默认值0。
IsSector:是否扇形,默认值False,默认是弧形。
IsAutoAnimate:是否自动使用动画,默认值False,若为True,则RadianStart和Radian的值变化时,自动使用动画。
效果展示:
核心代码:
private Geometry DrawGeometry() { // 圆心 var cx = RenderSize.Width / 2; var cy = RenderSize.Height / 2; // 若控件大小为0,或弧度为0,则不绘制 if (cx == 0 || cy == 0 || Radian == 0) return Geometry.Empty; var r = Math.Min(cx, cy) - StrokeThickness / 2; // 半径 var d = 2 * r; // 直径 // 若弧度恰好为一个整圆,则绘制两个半圆 if (Radian % 360 == 0) { // 计算开始、结束弧度坐标点 var s = CoordMap(cx, cy, r, 0); var e = CoordMap(cx, cy, r, 180); var desc = $"M0 0 M{d} {d} M{s.X} {s.Y} A{r} {r} 0 0 1 {e.X} {e.Y} A{r} {r} 0 0 1 {s.X} {s.Y}"; var geometry = Geometry.Parse(desc); geometry.Freeze(); return geometry; } else { // 计算开始、结束弧度坐标点 var s = CoordMap(cx, cy, r, RadianStart); var e = CoordMap(cx, cy, r, RadianStart + Radian); // 判断是否为大圆 var lenghty = Radian % 360 > 180 ? 1 : 0; string desc = null; // 判断是否扇形 if (IsSector) desc = $"M0 0 M{d} {d} M{cx} {cy} L{s.X} {s.Y} A{r} {r} 0 {lenghty} 1 {e.X} {e.Y} Z"; else desc = $"M0 0 M{d} {d} M{s.X} {s.Y} A{r} {r} 0 {lenghty} 1 {e.X} {e.Y}"; var geometry = Geometry.Parse(desc); geometry.Freeze(); return geometry; } } /// <summary> /// 极坐标转换 /// </summary> /// <param name="x">圆心x</param> /// <param name="y">圆心y</param> /// <param name="r">半径</param> /// <param name="a">弧度</param> /// <returns></returns> private Point CoordMap(Double x, Double y, Double r, Double a) { var ta = (360 - a) * Math.PI / 180; var tx = r * Math.Cos(ta); // 角度邻边 var ty = r * Math.Sin(ta); // 角度的对边 return new Point(x + tx, y - ty); }
更多详情,请查看PP.WPF控件库。
原文地址:https://www.cnblogs.com/pumbaa/p/15009571.html
- [数据清洗]-Pandas 清洗“脏”数据(一)
- [数据清洗]-混乱的邮编数据
- 10行代码,Python实现爬取淘宝/天猫评论
- 4.请求安全-- 结合使用的安全优势总结
- TensorFlow强化学习入门(4)——深度Q网络(DQN)及其扩展
- 3.请求安全-- 如何验证请求的唯一性
- 2.请求安全-- MD5的必要性以及实际应用场景
- 1.请求安全-- 一个简单的 单设备登录 单点登录
- phalapi-进阶篇3(自动加载和拦截器)
- phalapi-进阶篇2(DI依赖注入和单例模式)
- 基于PhalApi的DB集群拓展 V0.1bate
- phalapi-进阶篇1(Api,Domain,和Model)
- 你不知道的Javascript:有趣的setTimeout
- phalapi-入门篇5(数据库操作和Model层)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法