数码分段灯制作方法(C制作指示灯)

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

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

  1. 通过GDI 绘制自定义LED指示灯控件;
  2. 调用现成的第三方控件库;
  3. 采用label标签,通过改变背景色实现;等等

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

01

实现效果

数码分段灯制作方法(C制作指示灯)(1)

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);

}

}

}

}

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页