群友提问:C#中的指示灯怎么做,改变状态有什么好的方法吗?
制作指示灯的方法有很多中:比如:
通过GDI+绘制自定义LED指示灯控件;
调用现成的第三方控件库;
采用label标签,通过改变背景色实现;等等
本文就以第三种方式展开讲解
01
—
实现效果
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;