C# 制作指示灯(经典)

群友提问:C#中的指示灯怎么做,改变状态有什么好的方法吗?

制作指示灯的方法有很多中:比如:

  1. 通过GDI+绘制自定义LED指示灯控件;

  2. 调用现成的第三方控件库;

  3. 采用label标签,通过改变背景色实现;等等

本文就以第三种方式展开讲解

01

实现效果

2f978e0bd19e060e2dcdd05a94373b55.gif

02


实现代码

前台代码:

添加两个按钮和一个标签:

<StackPanel><Border BorderBrush="Red"></Border><Button Name="StartBtn" Content="Start"/><Button Name="StopBtn" Content="Stop"/><Label Name="DisplayLbl" Visibility="{Binding DisplaySwitch}" FontSize="200"HorizontalAlignment="Center" VerticalAlignment="Center"Content="{Binding LabelText}" Foreground="{Binding ForeColor}" /></StackPanel>

后台代码:

①安装PropertyChanged.Fody,using PropertyChanged;然后在类前面添加   [AddINotifyPropertyChangedInterface],类中所有属性变更后就会自动通知界面变更;

②通过DisplaySwitch 属性控制指示灯的显示或者隐藏,然后通过界面的start按钮启动指示灯,stop关闭指示灯;

③指示灯背景色的改变通过独立线程控制,跨线程修改UI线程控件属性使用Caliburn.Micro框架下的  Execute.OnUIThread(()=>{});实现。

using PropertyChanged;
using System.Threading;
using System.Windows;
using System.Windows.Media;
using Brush = System.Windows.Media.Brush;namespace Caliburn.Micro.Hello
{[AddINotifyPropertyChangedInterface]public class IndicatorLightViewModel : IViewModel{public Visibility DisplaySwitch { get; set; } = Visibility.Hidden;public string LabelText { get; set; }public Brush ForeColor { get; set; }private Thread workTask;public IndicatorLightViewModel(){ForeColor = new SolidColorBrush(Color.FromRgb(255, 0, 0));}public void StartBtn(){DisplaySwitch = Visibility.Visible;LabelText = "●";if (workTask == null || !workTask.IsAlive){workTask = new Thread(IndicatorLightOperation);//添加线程 workTask.IsBackground = true;workTask.Start();}}public void StopBtn(){if (workTask == null || workTask.IsAlive){workTask.Abort();}DisplaySwitch = Visibility.Hidden;}public void IndicatorLightOperation(){while (true){Execute.OnUIThread(()=>{if (((SolidColorBrush)ForeColor).Color.Equals(Color.FromRgb(255, 0, 0))){ForeColor = new SolidColorBrush(Color.FromRgb(0, 255, 0));}else{ForeColor = new SolidColorBrush(Color.FromRgb(255, 0, 0));}});Thread.Sleep(500);}}}
}

03


                         其它相关:Brush颜色转换

1、String转换成ColorColor color = (Color)ColorConverter.ConvertFromString(string);2、String转换成BrushBrushConverter brushConverter = new BrushConverter();Brush brush = (Brush)brushConverter.ConvertFromString(string);3、Color转换成BrushBrush brush = new SolidColorBrush(color));4、Brush转换成Color有两种方法:(1)先将Brush转成string,再转成Color。Color color= (Color)ColorConverter.ConvertFromString(brush.ToString());(2)将Brush转成SolidColorBrush,再取Color。Color color= ((SolidColorBrush)CadColor.Background).Color;

232ddfcfecc11d8f3a341a74a5b45b0a.png

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

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

相关文章

linux网络编程之SCTP套接字常用接口

转载地址&#xff1a; oracle开发帮助文档&#xff1a;http://docs.oracle.com/cd/E19253-01/819-7052/index.html SCTP 套接字接口 当 socket() 调用为 IPPROTO_SCTP 创建套接字时&#xff0c;它会调用特定于 SCTP 的套接字创建例程。针对 SCTP 套接字执行的套接字调用会自动调…

第一个c++泛型函数(即模板)

先定义如下&#xff1a; ns.h template <typename T> // 这个关键字typename, 明显多此一举 inline void PRINT_ELEMENTS(const T& coll,const std::string& optstr"") {std::cout << optstr << endl;for(const auto& ele:coll) {st…

结合ChatGPT和MINDSHOW自动生成PPT

总结/朱季谦 一、首先&#xff0c;通过chatGPT说明你的需求&#xff0c;学会提问是Ai时代最关键的一步。你需要提供一些关键信息&#xff0c;如果没有关键信息&#xff0c;就按照大纲方式让它设计&#xff0c;例如&#xff0c;我让它帮我写一份《2023年年中述职报告》的模版—…

位域全解析

所谓”位域“是把一个字节中的二进位划分为几 个不同的区域&#xff0c; 并说明每个区域的位数。每个域有一个域名&#xff0c;允许在程序中按域名进行操作。 它实际上是C语言提供的一种数据结构。使用位域的好处是&#xff1a; 1.有些信息在存储时&#xff…

华为怎么删除自带的音乐_原来华为手机相册隐藏剪辑功能!按下这个开关,还能制作音乐相册...

华为手机相册你肯定在用&#xff0c;但除了最近删除、智能搜索之外&#xff0c;你还知道手机相册的其他功能吗&#xff1f;这里就分享一个&#xff0c;相册中隐藏的实用剪辑功能&#xff0c;按下这个开关&#xff0c;还能把照片制作成音乐相册。创作开关首先将华为手机上的相册…

使用 Dapr 缩短软件开发周期,提高生产效率

Microsoft DevOps 文档里的文章&#xff08;https://docs.microsoft.com/zh-cn/azure/devops/report/dashboards/cycle-time-and-lead-time?viewazure-devops&#xff09;中的这张图片在给我们介绍了 什么是周期时间 以及它如何影响我的项目流时非常有影响力。第一次输入 &quo…

各种加密算法

2019独角兽企业重金招聘Python工程师标准>>> 如基本的单向加密算法&#xff1a; BASE64 严格地说&#xff0c;属于编码格式&#xff0c;而非加密算法MD5(Message Digest algorithm 5&#xff0c;信息摘要算法)SHA(Secure Hash Algorithm&#xff0c;安全散列算法)H…

C++之namespace和::使用总结

1、命名空间(namespace使用总结) C++中采用的是单一的全局变量命名空间。在这单一的空间中,如果有两个变量或函数的名字完全相同,就会出现冲突。当然,你也可以使用不同的名字,但有时我们并不知道另一个变量也使用完全相同的名字;有时为了程序的方便,必需使用同一名字,…

利用Xshell实现非对称秘钥对安全登陆linux服务器(Centos、Ubuntu)

非对称加密算法简述&#xff1a;对称加密算法在加密和解密时使用的是同一个秘钥&#xff1b;而非对称加密算法需要两个密钥来进行加密和解密&#xff0c;这两个秘钥是公开密钥&#xff08;public key&#xff0c;简称公钥&#xff09;和私有密钥&#xff08;private key&#x…

一秒点击屏幕次数测试_安卓App性能专项测试流畅度深度解析

指标背景流畅度&#xff0c;顾名思义是用户感知使用App页面时的流畅情况。“App卡不卡”&#xff0c;这是用户最直接的感受。 但是要用量化之后的数据衡量流畅度&#xff0c;在Android平台这边并没有直接有效的方式/手段去监控。帧率&刷新频率首先需要了解到两个概念&#…

PowerDesigner新建模板

http://my.oschina.net/kzhou/blog/150290转载于:https://www.cnblogs.com/mawenzhu/p/4390195.html

C# 实例解释面向对象编程中的单一功能原则

在面向对象编程中&#xff0c;SOLID 是五个设计原则的首字母缩写&#xff0c;旨在使软件设计更易于理解、灵活和可维护。这些原则是由美国软件工程师和讲师罗伯特C马丁(Robert Cecil Martin)提出的许多原则的子集&#xff0c;在他2000年的论文《设计原则与设计模式》中首次提出…

C++之virtual 方法

1、例子1 #include <iostream> class A { public:const char* fetchClassName() { return "A"; } };class B: public A { public:const char* fetchClassName() { return "B"; } };int main(void) {B obj_b;A &obj_a = obj_b;std::cout <<…

U盘安装Ubuntu三步走

需要工具&#xff1a; U盘、Ubuntu的ISO镜像、universal usb installer 1、下载Ubuntu &#xff08;1&#xff09; &#xff08;2&#xff09;我这里下载14.04版本 &#xff08;3&#xff09;我这里下载64位系统 下载后得到的是个torrent种子&#xff0c;双击后用迅雷下载即可 …

sdram 时钟相位_零基础学FPGA (二十五)必会! 从静态时序分析到SDRAM时序收敛(下篇)...

七、SDRAM工作时钟相位偏移计算本文引用地址&#xff1a;http://www.eepw.com.cn/article/279083.htm从上篇文章中我们知道&#xff0c;我们的数据是要经过一定的延时才会到达目标器件的&#xff0c;这个延时也就是相对于源寄存器的时钟发射沿的时间延时&#xff0c;数据在源寄…

星跃计划 | 新项目持续招募中!MSR Asia-MSR Redmond 联合科研计划邀你申请!

微软亚洲研究院与微软总部联合推出的“星跃计划”科研合作项目邀请你来报名&#xff01;本次“星跃计划”报名再次新增了来自微软 ED (Experiences Devices) Applied Research 全球总部的新项目&#xff0c;欢迎大家关注与申请&#xff01;还在等什么&#xff1f;加入“星跃计…

C++之map的前后遍历

java用迭代器只能往后迭代 但是C可以往后迭代和往前迭代 1、CMap往后迭代 map<int,int> amap; amap.insert(pair<int,int>(1,1)); amap.insert(pair<int.int>(2,2)); map<int,int>::iterator it; for(it amap.begin();it ! ampa.end();it…

Linux服务器上监控网络带宽与监控性能命令大全

【51CTO精选译文】本文介绍了一些可以用来监控网络使用情况的Linux命令行工具。这些工具可以监控通过网络接口传输的数据&#xff0c;并测量目前哪些数据所传输的速度。入站流量和出站流量分开来显示。一些命令可以显示单个进程所使用的带宽。这样一来&#xff0c;用户很容易发…

Android的AlertDialog详解

AlertDialog的构造方法全部是Protected的&#xff0c;所以不能直接通过new一个AlertDialog来创建出一个AlertDialog。 要创建一个AlertDialog&#xff0c;就要用到AlertDialog.Builder中的create()方法。 使用AlertDialog.Builder创建对话框需要了解以下几个方法&#xff1a; s…

C++中之a[5](栈区)和int a=new int[5](堆区)有什么区别

1、int* anew int[5]需要判断内存是否分配成功&#xff0c;以及在不用时需要使用delete[] a进行内存释放&#xff1b; 2、如果不是a[5]&#xff0c;而是a[5000000000]或者更大的话&#xff0c;那一般情况下&#xff0c;就只能使用int* anew这种方式了。这个涉及到内存存放位置的…