用C# WPF简单实现仪表控件
时间如流水,只能流去不流回!
点赞再看,养成习惯,这是您给我创作的动力!
本文 Dotnet9 https://dotnet9.com 已收录,站长乐于分享dotnet相关技术,比如Winform、WPF、ASP.NET Core等,亦有C++桌面相关的Qt Quick和Qt Widgets等,只分享自己熟悉的、自己会的。
阅读导航:
一、先看效果
二、本文背景
三、代码实现
四、文章参考
五、代码下载
一、先看效果

二、本文背景
小编全程是看 Design com WPF 大神视频手敲的仪表控件代码,视频长度19:28,只有背景声音,无国界的视频传播课程,和大神只有代码交流,大家有兴趣,可以到大神YouTube上膜拜,看视频学C# WPF技术我看行。
三、代码实现
整个解决方案结构:

1、站长使用.Net Core 3.1创建的WPF工程,创建的名称为“Gauge”的解决方案。
2、添加一个用户控件,命名为“UserControlGauge.xaml”
下面就是仪表控件的xaml部分,代码不多,总体上就是用两个Border绘制出仪表盘的轮廓,再加一个表针Border、一个数值展示TextBlock,外加一个控制仪表值的Slider,就这么简单做出了仪表控件的一个大致样子:
1 <UserControl x:Class="Gauge.UserControlGauge"
2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
5 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
6 xmlns:local="clr-namespace:Gauge"
7 mc:Ignorable="d"
8 d:DesignHeight="450" d:DesignWidth="800">
9 <Grid>
10 <Slider Minimum="0" Maximum="170" Width="300" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="40" Value="{Binding Path=Value}"/>
11 <Border HorizontalAlignment="Center" VerticalAlignment="Bottom" Height="300" Width="600" BorderBrush="#FFCF5D1D"
12 BorderThickness="2 2 2 0" CornerRadius="300 300 0 0" Background="#FF151515"/>
13 <Border HorizontalAlignment="Center" VerticalAlignment="Bottom" Height="290" Width="580" BorderBrush="#FFCF5D1D"
14 BorderThickness="0 2 0 0" CornerRadius="300 300 0 0">
15 <Border.Effect>
16 <DropShadowEffect Color="#FFFFC7A7" BlurRadius="10" ShadowDepth="2"/>
17 </Border.Effect>
18 </Border>
19 <TextBlock HorizontalAlignment="Center" VerticalAlignment="Bottom" Margin="100" FontSize="80"
20 FontFamily="Agency FB" Foreground="#FF95D4FF" Text="{Binding Path=Value,Mode=TwoWay}">
21 <TextBlock.Effect>
22 <DropShadowEffect BlurRadius="20" Color="#FF91DEFB" ShadowDepth="0" />
23 </TextBlock.Effect>
24 </TextBlock>
25 <Border Width="5" CornerRadius="120 120 0 0" Background="#FFFF6901" RenderTransformOrigin="0.5 2" Height="140" Margin="0 0 0 140"
26 VerticalAlignment="Bottom" HorizontalAlignment="Center">
27 <Border.RenderTransform>
28 <TransformGroup>
29 <ScaleTransform/>
30 <SkewTransform/>
31 <RotateTransform Angle="{Binding Path=Angle}"/>
32 <TranslateTransform/>
33 </TransformGroup>
34 </Border.RenderTransform>
35 </Border>
36 </Grid>
37 </UserControl>
3、添加仪表控件ViewModel
仪表控件实际使用场景,可能要在仪表盘上加上显示的刻度值,仪表值会根据业务实时变化等 ,这些都方便添加,读者可以自己扩展,下面的ViewModel只是绑定了仪表控件的指针摆动角度及显示的实际刻度值:
1 using System.ComponentModel;
2
3 namespace Gauge
4 {
5 public class GaugeViewModel : INotifyPropertyChanged
6 {
7 public event PropertyChangedEventHandler PropertyChanged;
8 private void NotifyPropertyChanged(string info)
9 {
10 if (PropertyChanged != null)
11 {
12 PropertyChanged(this, new PropertyChangedEventArgs(info));
13 }
14 }
15
16 public GaugeViewModel()
17 {
18 Angle = -85;
19 Value = 0;
20 }
21
22 private int _angle;
23 public int Angle
24 {
25 get { return _angle; }
26 private set
27 {
28 if (value != _angle)
29 {
30 _angle = value;
31 NotifyPropertyChanged("Angle");
32 }
33 }
34 }
35
36 private int _value;
37 public int Value
38 {
39 get { return _value; }
40 set
41 {
42 if (value != _value && value >= 0 && value <= 170)
43 {
44 _value = value;
45 Angle = value - 85;
46 NotifyPropertyChanged("Value");
47 }
48 }
49 }
50 }
51 }
4、主窗体MainWindow
xaml部分简单,直接加入仪表控件即可:
1 <Window x:Class="Gauge.MainWindow"
2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
6 xmlns:local="clr-namespace:Gauge"
7 mc:Ignorable="d"
8 Title="MainWindow" Height="450" Width="800" Background="#FF363636" WindowStyle="None" ResizeMode="NoResize" WindowStartupLocation="CenterScreen">
9 <Grid>
10 <local:UserControlGauge/>
11 </Grid>
12 </Window>
后台绑定控件ViewModel
1 using System.Windows;
2
3 namespace Gauge
4 {
5 /// <summary>
6 /// Interaction logic for MainWindow.xaml
7 /// </summary>
8 public partial class MainWindow : Window
9 {
10 public MainWindow()
11 {
12 this.DataContext = new GaugeViewModel();
13 InitializeComponent();
14 }
15 }
16 }
四、文章参考
建议直接打开大神视频学习,他的YouTube上还有很多代码视频哦,参考:
Design com WPF: https://www.youtube.com/watch?v=KElruOV2EfE&t=930s 。
五、代码下载
文章中代码几乎已经全部贴出,就是这么多。
除非注明,文章均由 Dotnet9 整理发布,欢迎转载。
转载请注明本文地址:https://dotnet9.com/6662.html
欢迎扫描下方二维码关注 Dotnet9 的微信公众号,本站会及时推送最新技术文章(微信公众号“dotnet9_com”):
如有收获,请大力转发,给Dotnet9赞助和支持,谢谢大家对dotnet技术的关注和支持 。
用C# WPF简单实现仪表控件的更多相关文章
- WPF简单的分页控件实现
XAML代码(使用ItemsControl控件实现): <UserControl x:Class="SunCreate.Vipf.Client.UI.CityDoor.PageCont ...
- WPF中的image控件的Source赋值
WPF中的Image控件Source的设置 1.XAML中 简单的方式(Source="haha.png"); image控件的Source设置为相对路径后(Source=&quo ...
- WPF Adorner+附加属性 实现控件友好提示
标题太空泛,直接上图 无论是在验证啊,还是提示方面等一些右上角的角标之类的效果,我们会怎么做? 这里介绍一种稍微简单一些的方法,利用附加属性和Adorner来完成. 例如WPF自带的控件上要加这样的效 ...
- WPF Step By Step 控件介绍
WPF Step By Step 控件介绍 回顾 上一篇,我们主要讨论了WPF的几个重点的基本知识的介绍,本篇,我们将会简单的介绍几个基本控件的简单用法,本文会举几个项目中的具体的例子,结合这些 例子 ...
- WPF中的ControlTemplate(控件模板)(转)
原文地址 http://www.cnblogs.com/zhouyinhui/archive/2007/03/28/690993.html WPF中的ControlTemplate(控件模板) ...
- WindowsXamlHost:在 WPF 中使用 UWP 控件库中的控件
在 WindowsXamlHost:在 WPF 中使用 UWP 的控件(Windows Community Toolkit) 一文中,我们说到了在 WPF 中引入简单的 UWP 控件以及相关的注意事项 ...
- WPF中的ControlTemplate(控件模板)
原文:WPF中的ControlTemplate(控件模板) WPF中的ControlTemplate(控件模板) ...
- [转]WPF中的ControlTemplate(控件模板)
WPF中的ControlTemplate(控件模板) ...
- 在WPF中使用WinForm控件方法
1. 首先添加对如下两个dll文件的引用:WindowsFormsIntegration.dll,System.Windows.Forms.dll. 2. 在要使用WinForm控 ...
- CYQ.Data 支持WPF相关的数据控件绑定(2013-08-09)
事件的结果 经过多天的思考及忙碌的开发及测试,CYQ.Data 终于在UI上全面支持WPF,至此,CYQ.Data 已经可以方便支持wpf的开发,同时,框架仍保留最低.net framework2.0 ...
随机推荐
- Python 潮流周刊第 32 期(摘要)
本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...
- 一键式调试工具—Reqable 使用指南
简介 Reqable是一款跨平台的专业HTTP开发和调试工具,在全平台支持HTTP1.HTTP2和HTTP3(QUIC)协议,简单易用.功能强大.性能高效,助力程序开发和测试人员提高生产力!本产品需要 ...
- OpenGL纹理转换谜团:纹理写入FRAMEBUFFER后的镜像现象
在OpenGL中,最近将一个 GL_TEXTURE_2D 纹理写入到 GL_FRAMEBUFFER ,然后从GL_FRAMEBUFFER读取为GL_TEXTURE_2D纹理后,发现GL_TEXTURE ...
- 现代 CSS 解决方案:文字颜色自动适配背景色!
在 23 年的 CSS 新特性中,有一个非常重要的功能更新 -- 相对颜色. 简单而言,相对颜色的功能,让我们在 CSS 中,对颜色有了更为强大的掌控能力. 其核心功能就是,让我们能够基于一个现有颜色 ...
- vue强制横屏
在app.vue中 <template> <div id="app"> <router-view /> </div> </te ...
- Quartz.Net系列(十八):Quartz.Net中通过SQLServer实现对Job、Trigger持久化存储
1.介绍 RAMJobStore:一但关闭应用程序,数据全部丢失 Quartz中提供了两种方式配置数据库 JobStoreTx:带有事务的 JobStoreCMT:不带事务的
- 电商业务容器化遇瓶颈,公有云Docker镜像P2P加速很安全
当前,电商平台会采用基于Docker的容器技术来承载618大促期间的一些关键业务版块,包括最简单的商品图片展示.订单详情页面等等. 通过容器化改造,电商平台的每个业务版块解耦,可以独立开发.部署和上线 ...
- KubeCon China 2023 | 拥抱开源,华为云原生华彩绽放
本文分享自华为云社区<KubeCon China 2023 | 拥抱开源,华为云原生华彩绽放>,作者: 云容器大未来 . 2023 年度云原生全球旗舰盛会 KubeCon + CloudN ...
- 终于搞懂了Python模块之间的相互引用问题
摘要:详细讲解了相对路径和绝对路径的引用方法. 在某次运行过程中出现了如下两个报错: 报错1: ModuleNotFoundError: No module named '__main__.src_t ...
- 解读8大场景下Kunpeng BoostKit 使能套件的最佳能力和实践
摘要:本次鲲鹏 BoostKit 训练营为开发者介绍如何基于鲲鹏 BoostKit 使能套件实现应用性能的加速,并重点剖析性能优化技术和关键能力. 本文分享自华为云社区<[云驻共创]" ...
