WPF实现仪表盘(刻度跟随)

 WPF开发者QQ群: 340500857  | 微信群 -> 进入公众号主页 加入组织

 前言,接着上一篇圆形进度条。

欢迎转发、分享、点赞、在看,谢谢~。  

01

效果预览

效果预览(更多效果请下载源码体验):

02


代码如下

一、DashboardControl.cs 代码如下

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Media.Animation;
using WpfDashboard.Models;namespace WpfDashboard
{public class DashboardControl : ProgressBar{public DashboardControl(){this.ValueChanged += CircularProgressBar_ValueChanged;}void CircularProgressBar_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e){DashboardControl bar = sender as DashboardControl;double currentAngle = bar.Angle;double targetAngle = e.NewValue / bar.Maximum * 180;Angle = targetAngle;if (ScaleArray == null)ArrayList();var count = Convert.ToInt32(Angle / (180 / ScaleNum));ScaleArray.ToList().ForEach(y =>{y.Background = Brushes.White;});Brush color = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FF19DCF0"));ScaleArray.Where(x => x.Index <= count).ToList().ForEach(y =>{y.Background = color;});}public double Angle{get { return (double)GetValue(AngleProperty); }set { SetValue(AngleProperty, value); }}public static readonly DependencyProperty AngleProperty =DependencyProperty.Register("Angle", typeof(double), typeof(DashboardControl), new PropertyMetadata(0.0));public IList<ScaleModel> ScaleArray{get { return (IList<ScaleModel>)GetValue(ScaleArrayProperty); }private set { SetValue(ScaleArrayProperty, value); }}public static readonly DependencyProperty ScaleArrayProperty =DependencyProperty.Register("ScaleArray", typeof(IList<ScaleModel>), typeof(DashboardControl), new PropertyMetadata(null));public int ScaleNum{get { return (int)GetValue(ScaleNumProperty); }set { SetValue(ScaleNumProperty, value); }}public static readonly DependencyProperty ScaleNumProperty =DependencyProperty.Register("ScaleNum", typeof(int), typeof(DashboardControl), new PropertyMetadata(18));void ArrayList(){List<ScaleModel> shortticks = new List<ScaleModel>();for (int i = 0; i < ScaleNum; i++){shortticks.Add(new ScaleModel { Index = i, Background = Brushes.White });}this.ScaleArray = shortticks;}}
}

二、App.xaml 代码如下

<Application x:Class="WpfDashboard.App"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:ec="http://schemas.microsoft.com/expression/2010/controls" xmlns:ed="http://schemas.microsoft.com/expression/2010/drawing"xmlns:local="clr-namespace:WpfDashboard"StartupUri="MainWindow.xaml"><Application.Resources><LinearGradientBrush x:Key="NormalBrush" EndPoint="0.5,1" StartPoint="0.5,0"><GradientStop Color="#FF164DA7"/><GradientStop Color="#FF19DCF0" Offset="1"/></LinearGradientBrush><Style TargetType="local:DashboardControl"><Setter Property="Maximum" Value="100"/><Setter Property="Background" Value="#252525"/><Setter Property="Width" Value="200"/><Setter Property="Height" Value="200"/><Setter Property="Template"><Setter.Value><ControlTemplate TargetType="local:DashboardControl"><Viewbox><Grid Width="{TemplateBinding Width}" Height="{TemplateBinding Height}"Background="{TemplateBinding Background}"RenderTransformOrigin="0.5,0.5"><Grid.RenderTransform><TransformGroup><RotateTransform Angle="-90"/></TransformGroup></Grid.RenderTransform><ed:Arc  ArcThickness="8" ArcThicknessUnit="Pixel" Fill="White"RenderTransformOrigin="0.5,0.5" StartAngle="0"EndAngle="180"Stretch="None"Margin="10"/><ed:Arc x:Name="PART_PathBackground" Margin="24" ArcThickness="0" ArcThicknessUnit="Pixel"EndAngle="180"StartAngle="0"Stretch="None" /><ed:Arc ArcThickness="8" ArcThicknessUnit="Pixel" Fill="{StaticResource NormalBrush}"StartAngle="0"EndAngle="{Binding Angle, RelativeSource={RelativeSource FindAncestor, AncestorType=ProgressBar}}"Stretch="None" Margin="10"/><ec:PathListBox IsHitTestVisible="False"ItemsSource="{Binding ScaleArray,RelativeSource={RelativeSource FindAncestor,AncestorType=ProgressBar}}"><ec:PathListBox.ItemTemplate><DataTemplate><Border Width="2" Height="8" Background="{Binding Background}" SnapsToDevicePixels="True"UseLayoutRounding="True" /></DataTemplate></ec:PathListBox.ItemTemplate><ec:PathListBox.LayoutPaths><ec:LayoutPath Distribution="Even" Orientation="OrientToPath"SourceElement="{Binding ElementName=PART_PathBackground}" /></ec:PathListBox.LayoutPaths></ec:PathListBox><Border RenderTransformOrigin="0.5,0.5" Margin="30,0,0,0"><Border.RenderTransform><TransformGroup><RotateTransform Angle="90"/></TransformGroup></Border.RenderTransform><TextBlock Foreground="{StaticResource NormalBrush}"FontSize="40"HorizontalAlignment="Center" VerticalAlignment="Center"Text="{Binding Path=Value, StringFormat={}{0}%, RelativeSource={RelativeSource TemplatedParent}}"FontWeight="Bold" FontFamily="Agency FB"/></Border></Grid></Viewbox></ControlTemplate></Setter.Value></Setter>
</Style></Application.Resources>
</Application>

三、MainWindow.xaml 代码如下

<Window x:Class="WpfDashboard.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:WpfDashboard"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800"><Grid><StackPanel VerticalAlignment="Center"><local:DashboardControl Value="{Binding ElementName=CirularSlider,Path=Value}"/><Slider Minimum="0" Maximum="100" Margin="0,10"x:Name="CirularSlider" IsSnapToTickEnabled="True"VerticalAlignment="Center" Value="10" Width="220"/></StackPanel></Grid>
</Window>

源码地址

github:https://github.com/yanjinhuagood/WPFDevelopers.git

gitee:https://gitee.com/yanjinhua/WPFDevelopers.git

WPF开发者QQ群: 340500857 

blogs: https://www.cnblogs.com/yanjinhua

Github:https://github.com/yanjinhuagood

出处:https://www.cnblogs.com/yanjinhua

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

转载请著名作者 出处 https://github.com/yanjinhuagood

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

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

相关文章

数学特级教师:数学除了做习题,我还他让他们看这十部纪录片!

全世界只有3.14 % 的人关注了青少年数学之旅今天我们要向大家强烈推荐一个分享数学知识、严选数学好物公众号“数学好物”。“数学好物”是一个致力为数学爱好者与家长&#xff0c;提供丰富的数学文化、数理思维知识、最新数学好物的公众号。就是他啦&#xff1a;长按二维码可以…

自适应布局

浮动 一列绝对定位,一列用margin撑开空间 margin负值:主体用一层包裹,浮动,内层用margin留出空间;其他列浮动,使用margin调整到空出的位置 1 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"2 "http://www.w3.org/TR/html4/strict.dtd">3 …

Hello Blazor:(2)集成Tailwind CSS

Blazor默认集成了bootstrap&#xff0c;对于我这种后端出身&#xff0c;对CSS一知半解的.NET开发人员来说&#xff0c;使用起来还是有一定难度的。好不容易才学到点皮毛&#xff0c;结果前端人员居然告诉我&#xff0c;bootstrap已经过时了&#xff0c;现在主流都用Tailwind CS…

一文让你掌握单元测试的Mock、Stub和Fake

单元测试中有几个神秘的概念&#xff0c;它们就是Mock&#xff0c;模拟对象&#xff1b;Stub&#xff0c;存根&#xff1b;Fake&#xff0c;伪对象&#xff0c;它们听起来很类似&#xff0c;也很容易混淆&#xff0c;让我们通过这篇文章揭开它们神秘的面纱&#xff0c;探索其幽…

Jafka源码粗略解读之二--关于JMX

2019独角兽企业重金招聘Python工程师标准>>> JMX Jafka里用到了JMX&#xff0c;之前也没用过&#xff0c;迅速突击了一下&#xff0c;感觉还是挺简单的&#xff1a; 有一篇文章用一个例子介绍JMX怎么使用的&#xff0c;简洁明了&#xff1a;http://www.javalobby.or…

参数化的RBAC模型

1 动机 基于角色的访问控制(RBAC)模型被普遍认为是一种有效的访问控制模型&#xff0c;它比传统的自主访问控制(DAC)和强制访问控制(MAC)具有更高的灵活性和更好的扩展性。 在实际应用中&#xff0c;随着企业规模以及信息系统规模逐渐扩大&#xff0c;系统中角色的数目也随之急…

使用 ML.NET 进行保险价格预测

此前通过多篇文章已充分介绍过&#xff0c;ML.NET是一个开源的跨平台机器学习框架&#xff0c;特别适合 .NET 开发人员。它允许将机器学习集成到 .NET 应用中&#xff0c;而无需离开 .NET 生态系统&#xff0c;甚至拥有 ML 或数据科学背景。ML.NET 现有的各种内置模型训练器可用…

送礼物给女生,她哭了是怎么回事?

全世界只有3.14 % 的人关注了青少年数学之旅中秋节快要到了&#xff0c;超模君说要给我准备个惊喜&#xff0c;what&#xff1f;结果我在桌面上发现了一个盒子和一大堆 垃圾 零件&#xff0c;清洁阿姨你在哪&#xff1f;我需要你。不过仔细一看&#xff0c;我去&#xff1f;&am…

oracle+11g+rda,Oracle RDA 4.20 初体验

RDA 全名RemoteDiagnostic Agent&#xff0c;是Oracle用来收集、分析数据库的工具&#xff0c;但统计信息远远大于只是数据库的&#xff0c;也可以说是现在一个Oracle dba 角色需要掌握的Oracle DB SERVER的信息&#xff0c;包含数据库安装、配置、性能、备份等信息、操作系统各…

室内设计品牌网站搭建的作用是什么

随着人们生活质量日益提升&#xff0c;对其自身的居住环境也有了较高要求&#xff0c;每个人审美不一样&#xff0c;无论自己居住的房屋还是公司办公/商场等场景都需要设计不同的内容&#xff0c;还有各种设施的摆放及类别等都有讲究&#xff0c;尤其对公司及商场等环境&#x…

面向.NET开发人员的Dapr- actors 构建块

原文地址&#xff1a;https://docs.microsoft.com/en-us/dotnet/architecture/dapr-for-net-developers/actors The actor model originated in 1973. It was proposed by Carl Hewitt as a conceptual model of concurrent computation, a form of computing in which several…

史上最严重的忘拿钥匙事件 | 今日最佳

全世界只有3.14 % 的人关注了青少年数学之旅&#xff08;视频源网络&#xff0c;侵权删&#xff09;难搞噢↓ ↓ ↓

oracle经常开关好吗,频繁开关机对电脑有什么影响吗?

2005-08-03 08:01:45没关系的哦&#xff0c;一天五六次正常&#xff0c;只要是正常开关机就OK。全部2005-08-03 08:01:452005-08-03 07:49:392005-08-03 05:21:09影响不大完全在合理范围内,等到坏的时候也应该淘汰了全部2005-08-03 05:21:092005-08-03 04:09:04原则上经常性的开…

老是担心数学学不好?这些基础是时候正视了!

我们都知道&#xff0c;数学是学生生涯的一门重要学科&#xff0c;与其担心三年级掉队&#xff0c;不如从小培养良好的学习兴趣和数感直觉&#xff0c;之后的学习就是水到渠成的事了&#xff0c;这可不是报个奥数班就万事大吉了&#xff0c;最关键的&#xff0c;还得从培养孩子…

老师“鬼话”全曝光!哈哈哈哈哈哈全国的老师都这样吗?

老师您辛苦了明天就是教师节啦今天超模君有幸采访到一位从教多年的数学老师01请问您教的科目是&#xff1f;数学收到&#xff0c;over02您从教多久了&#xff1f;唔…快10年了您当过班主任吗&#xff1f;当过&#xff0c;现在也是班主任工作日常是怎样的&#xff1f;备课、改作…

单体系统如何拆分为微服务

当单体系统越来越大&#xff0c;并难于维护时&#xff0c;很多企业开始有意把单体系统拆分为微服务风格架构。这么做很有意义&#xff0c;但不容易。要做好这件事情我们必须学习&#xff0c;我们从一个简单的服务开始&#xff0c;另一方面拉出以垂直功能为基础的服务&#xff0…

Wiki及其他

大概是2年多以前&#xff0c;我几乎是和blog一起听到wiki的概念的。当时blog正备受推崇&#xff0c;而个性色彩稍逊一筹、讲究严肃协作的wiki则没怎么受公众注意。我也一样。后来进入行业之后&#xff0c;我一直想有一套知识库(Knowledge Base)系统&#xff0c;多分类、复杂查找…

linux服务器管理公司用户,在Linux服务器Jenkins中管理用户和角色的方法

下面将教你如何在Linux服务器Jenkins中管理用户和角色&#xff0c;它需要创建角色并分配给用户&#xff0c;你需要运行Jenkins服务器才能操作接下来的工作。安装Jenkins参考文章在Jenkins中管理用户和角色默认情况下&#xff0c;当你在Jenkins中创建用户时&#xff0c;它几乎可…

还在用Excel做数据分析?两大方法5分钟完成别人一天的工作

全世界只有3.14 % 的人关注了青少年数学之旅我是个只会用Excel的数据分析工作者。有一天&#xff0c;我和同事大鹏约好晚上一起喝酒&#xff0c;离下班还有5分钟&#xff0c;老板突然Q我&#xff1a;我怀着忐忑的心情打开了一个神秘的压缩包&#xff1a;912个CSV表格&#xff0…

poj1033

模拟题&#xff0c;注意不需要移动的情况要特殊输出 #include <cstdio> #include <cstring> #include <cstdlib> using namespace std;#define MAX_CLUSTER_NUM 10005int cluster_num, file_num; int link[MAX_CLUSTER_NUM]; bool is_free[MAX_CLUSTER_NUM];…