WPF自定义LED风格数字显示控件

本文介绍了如何在WPF项目中创建一个自定义的LED风格数字显示控件。作者由于找不到满足需求的现成控件,决定自行设计。控件库包含DigitalControl(单个LED数字控件)、DigitalPanelControl(组合控件)、Segment类(数字的7条边及特殊符号)和DigitalData类(数字数据存储)。通过DigitalParam参数,构造Segment,组合成DigitalControl,进而形成DigitalPanelControl。文章详细阐述了各个类的功能和实现逻辑,以及绘图方法。
摘要由CSDN通过智能技术生成

       前段时间做过一个WPF的项目,需要用到这样一个控件,在网上找了一下没找到特别合适的,要么有的不是WPF的控件(无法使用WPF的绑定功能),要么有的是WPF的但是效果不太好,或者不满足需求(比如没有小数点.或者冒号:)。所以就参考着别人的东西自己做了一个。

       本文大部分属于原创内容,但是在图像绘制的时候参考(其实是照搬)了这个文章里的内容:A Fine-looking Segmented LED Control

     

      一 整个控件库的目录结构:


      


       其中DigitalControl.cs为单个LED数字控件,DigitalPanelControl.cs为多个DigitalControl的组合控件,Segment目录下的类为数字的7条边和冒号以及小数点的类。Data目录下的DigitalData类存放一个DigitalControl的Segment数据,而DigitalParam存放单个DigitalControl的基本属性,包括宽,高,线条粗细以及间距等。


       控件构造的基本思路为:通过单个控件的基本属性参数(宽、高、粗细等)——也就是DigitalParam类中的数据——去构造组成单个数字的10个Segment,然后通过组合Segment得到DigitalControl,再通过组合DigitControl得到DigitalPanelControl,普通的控件使用者主要是使用DigitalPanelControl。


       二 Segment类 


      


        ===========================


      


       Segment类为数字的7条边(如上图)以及冒号(:)的两个点和小数点,一共10个子类,他们继承共同的父类Segments,由一个或多个点构成的Path组成,每个Segment的画法如上图所示。

       (注:上图照搬自 这里 )

       Segment类为一个抽象父类,类中定义了一个List<Point>列表,用来存放构成Segment的点,然后声明了一个GetPoints的虚方法,在其子类中复写了此方法,主要用于通过给定的DigitalParam数据得到Segment所需要的点(填充_points)。


       下面是Segment父类和其中一个子类TopSegment的代码。

    public abstract class Segment
    {
        private List<Point> _points = new List<Point>();

        public List<Point> Points
        {
            get { return _points; }
            set { _points = value; }
        }

        public abstract void GetPoints(DigitalParam dp);
    }


    public class TopSegment : Segment
    {
        public TopSegment(DigitalParam dp)
        {
            GetPoints(dp);
        }

        public override void GetPoints(DigitalParam dp)
        {
            Points.Add(new Point(dp.BevelWidth * 2 + dp.SegmentInterval, 0));
            Points.Add(new Point(dp.DigitalWidth - dp.BevelWidth * 2 - dp.SegmentInterval, 0));
            Points.Add(new Point(dp.DigitalWidth - dp.BevelWidth - dp.SegmentInterval, dp.BevelWidth));
            Points.Add(new Point(dp.DigitalWidth - dp.SegmentInterval - dp.SegmentThickness, dp.SegmentThickness));
            Points.Add(new Point(dp.SegmentThickness + dp.SegmentInterval, dp.SegmentThickness));
            Points.Add(new Point(dp.BevelWidth + dp.SegmentInterval, dp.BevelWidth));
        }
    }

      

       三 DigitalData类


       该类为单个数字控件的数据类,主要包括10个支持数字显示的Segment的字段和属性,以及两个控制数字显示内容的方法。其中DisplayDigital根据给定的数字字符去调用LightDigitalSegments方法,通过LightDigitalSegments方法设置不同Segment的显示或隐藏来显示具体的数字。


    public class DigitalData
    {
        #region Fields

        private Path topSegment;
        private Path upLeftSegment;
        private Path upRightSegment;
        private Path middleSegment;
        private Path downLeftSegment;
        private Path downRightSegment;
        private Path bottomSegment;

        private Path dot
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值