C# 制作指示灯(经典)

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

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

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

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

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

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

01—实现效果

C# 制作指示灯(经典)

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转换成Color
  Color color = (Color)ColorConverter.ConvertFromString(string);
2、String转换成Brush
   BrushConverter brushConverter = new BrushConverter();   Brush brush = (Brush)brushConverter.ConvertFromString(string);
3、Color转换成Brush    Brush 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;