WPF自定义圆形百分比进度条

先看效果图

1.界面代码

<UserControl x:Class="LensAgingTest.CycleProcessBar1"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:LensAgingTest"mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"><Grid><Viewbox><Grid Width="34" Height="34"><Path Name="myCycleProcessBar" Data="M17,3 A14,14 0 1 0 17.001,3 " Stroke="LightGray" StrokeThickness="3" Height="34" Width="34" VerticalAlignment="Center" HorizontalAlignment="Center"/><Path Name="myCycleProcessBar1" Data="M17,3 A14,14 0 0 1 16,3 " Stroke="Green" StrokeThickness="3" Height="34" Width="34" VerticalAlignment="Center" HorizontalAlignment="Center"></Path><Label Name="lbValue" Content="50%" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="9" /></Grid></Viewbox></Grid>
</UserControl>

2.后台代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;namespace LensAgingTest
{/// <summary>/// CycleProcessBar1.xaml 的交互逻辑/// </summary>public partial class CycleProcessBar1 : UserControl{public CycleProcessBar1(){InitializeComponent();}public double CurrentValue1{set { SetValue(value); }}/// <summary>/// 设置百分百,输入小数,自动乘100/// </summary>/// <param name="percentValue"></param>private void SetValue(double percentValue){/*****************************************方形矩阵边长为34,半长为17环形半径为14,所以距离边框3个像素环形描边3个像素******************************************/double angel = percentValue * 360; //角度double radius = 14; //环形半径//起始点double leftStart = 17;double topStart = 3;//结束点double endLeft = 0;double endTop = 0;//数字显示lbValue.Content = (percentValue * 100).ToString("0") + "%";/************************************************ 整个环形进度条使用Path来绘制,采用三角函数来计算* 环形根据角度来分别绘制,以90度划分,方便计算比例***********************************************/bool isLagreCircle = false; //是否优势弧,即大于180度的弧形//小于90度if (angel <= 90){/*******************   ** * ra* * * * * * * * **********************/double ra = (90 - angel) * Math.PI / 180; //弧度endLeft = leftStart + Math.Cos(ra) * radius; //余弦横坐标endTop = topStart + radius - Math.Sin(ra) * radius; //正弦纵坐标}else if (angel <= 180){/*******************  * * * * * * * * * ** * ra*  **   *******************/double ra = (angel - 90) * Math.PI / 180; //弧度endLeft = leftStart + Math.Cos(ra) * radius; //余弦横坐标endTop = topStart + radius + Math.Sin(ra) * radius;//正弦纵坐标}else if (angel <= 270){/*******************  * * * * * * * * * ** **ra**   *******************/isLagreCircle = true; //优势弧double ra = (angel - 180) * Math.PI / 180;endLeft = leftStart - Math.Sin(ra) * radius;endTop = topStart + radius + Math.Cos(ra) * radius;}else if (angel < 360){/******************   **  *  ra * * * * * * * * * * **********************/isLagreCircle = true; //优势弧double ra = (angel - 270) * Math.PI / 180;endLeft = leftStart - Math.Cos(ra) * radius;endTop = topStart + radius - Math.Sin(ra) * radius;}else{isLagreCircle = true; //优势弧endLeft = leftStart - 0.001; //不与起点在同一点,避免重叠绘制出非环形endTop = topStart;}Point arcEndPt = new Point(endLeft, endTop); //结束点Size arcSize = new Size(radius, radius);SweepDirection direction = SweepDirection.Clockwise; //顺时针弧形//弧形ArcSegment arcsegment = new ArcSegment(arcEndPt, arcSize, 0, isLagreCircle, direction, true);//形状集合PathSegmentCollection pathsegmentCollection = new PathSegmentCollection();pathsegmentCollection.Add(arcsegment);//路径描述PathFigure pathFigure = new PathFigure();pathFigure.StartPoint = new Point(leftStart, topStart); //起始地址pathFigure.Segments = pathsegmentCollection;//路径描述集合PathFigureCollection pathFigureCollection = new PathFigureCollection();pathFigureCollection.Add(pathFigure);//复杂形状PathGeometry pathGeometry = new PathGeometry();pathGeometry.Figures = pathFigureCollection;//Data赋值//myCycleProcessBar.Data = pathGeometry;myCycleProcessBar1.Data = pathGeometry;//达到100%则闭合整个if (angel == 360)myCycleProcessBar1.Data = Geometry.Parse(myCycleProcessBar1.Data.ToString() + " z");}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/433375.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ansible自动化运维(三)Playbook 模式详解

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

php mysql字段默认值使用问题

前提是使用了事务&#xff0c;在第一个阶段 是A表操作保存&#xff0c;第二阶段操作B表&#xff0c;操作B表的时候使用了A表的一个字段&#xff0c;这个字段在第一阶段没有设置值&#xff0c;保存的时候使用字段默认值。 【这种情况 最好是在第一阶段 把后面要使用的字段设置好…

Elasticsearch:Simulate ingest API

Ingest pipeline 为我们摄入数据提供了极大的方便。在我之前的文章中&#xff0c;有非常多的有关 ingest pipeline 的文章。请详细阅读文章 “Elastic&#xff1a;开发者上手指南”。针对一组提供的文档执行摄取管道&#xff0c;可以选择使用替代管道定义。 Simulate ingest AP…

AWTK 开源串口屏开发(8) - 系统设置

AWTK 开源串口屏开发 - 系统设置 系统设置只是一个普通应用程序&#xff0c;不过它会用 默认模型 中一些内置的属性和命令&#xff0c;所以这里专门来介绍一下。 1. 功能 在这个例子会用到 默认模型 中一些下列内置的属性和命令&#xff1a; 内置属性 属性类型说明rtc_yea…

【数据库】聊聊explain如何优化sql以及索引最佳实践

在实际的开发中&#xff0c;我们难免会遇到一些SQL优化的场景&#xff0c;虽然之前也看过周阳的课程&#xff0c;但是一直没有进行细心的整理&#xff0c;所以本篇会进行详细列举explain的相关使用&#xff0c;以及常见的索引最佳实践&#xff0c;并通过案例进行讲解。 数据准…

Tensorflow2.0笔记 - tensor排序操作

本笔记主要记录sort,argsort,以及top_k操作&#xff0c;加上一个求Top K准确度的例子。 import tensorflow as tf import numpy as nptf.__version__#sort,argsort#对1维的tensor进行排序 tensor tf.random.shuffle(tf.range(10)) print(tensor) #升序 print("tf.sort(d…

Go 从标准输入读取数据

fmt.Scan系列 fmt.Scan函数定义如下&#xff1a; // Scan scans text read from standard input, storing successive space-separated values into successive arguments. // Newlines count as space. // It returns the number of items successfully scanned. // If tha…

区块链技术在金融领域的应用

区块链技术在金融领域的应用广泛&#xff0c;它提供了一种分布式、去中心化、透明且安全的方式来进行交易和资产管理。以下是一些区块链技术在金融领域的主要应用&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎…

达梦数据库——记录一次离谱的登录失败报错

好久没更新了哇 前面有整理过一些常见的数据库登录失败问题哈&#xff0c;今天记录一个遇到概率比较小&#xff0c;但碰上了一般不太容易找到原因的登录失败问题。 今天给客户同时初始化了三台服务器数据库&#xff0c;惟独这一台死活登不进去&#xff0c;满脑子问号&#xf…

08.Elasticsearch应用(八)

Elasticsearch应用&#xff08;八&#xff09; 1.为什么需要相关性算分 我们在文档搜索的时候&#xff0c;匹配程度越高的相关性算分越高&#xff0c;算分越高的越靠前&#xff0c;但是有时候我们不需要算分越高越靠前我们可能需要手动影响算分来控制顺序比如广告&#xff08…

【unity小技巧】使用动画状态机脚本实现一个简单3d敌人AI功能

文章目录 敌人导航敌人动画导入动画修改循环动画配置其他不循环的动画配置 配置敌人模型动画配置敌人受伤死亡脚本控制敌人状态机待机 行走 巡逻 攻击状态修改待机行为脚本修改巡逻行为脚本修改追击行为脚本修改攻击行为脚本 删除旧的动画控制代码创建寻路点 修改代码&#xff…

Vue组件之间的通信方式都有哪些

Vue组件之间的通信方式 组件间通信的概念组件间通信解决了什么组件间通信的分类 父子组件之间的通信兄弟组件之间的通信祖孙与后代组件之间的通信非关系组件间之间的通信 组件间通信的方案 props传递数据$emit 触发自定义事件refEventBusparent、rootattrs与listenersprovide …