使用自定义控件显示数字

使用自定义控件显示数字

有时候,出于美观需要,我们需求将数字显示为下图右侧效果,实现比较简单.主要代码做笔记如下:

在这里插入图片描述

一、自定义控件过程

  1. 在项目中新建类MydigitalEx,继承自Control
public class Mydigital : Control
  1. 创建依赖属性,用于接受数字字符串.并重写OnRender方法
using System;
using System.Globalization;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;

namespace Wpf超级大乐透
{
    public class MydigitalEx : Control
    {

        #region 依赖属性数字
        /// <summary>
        /// 数字
        /// </summary>
        public static readonly DependencyProperty DigitalNumberProperty;

        /// <summary>
        /// 字体画刷
        /// </summary>
        public static readonly DependencyProperty DigitalBrushFontProperty;
        /// <summary>
        /// 圆形背景颜色
        /// </summary>
        public static readonly DependencyProperty DigitalBlackgroundProperty;
        public static readonly DependencyProperty DigitalPenBrushProperty;
        public static readonly DependencyProperty DigitalBrushThicknessProperty;
        public static readonly DependencyProperty RadiusProperty;

        public string DigitalNumber
        {
            get { return (string)GetValue(DigitalNumberProperty); }
            set { SetValue(DigitalNumberProperty, value); }
        }
        public Brush DigitalBlackground
        {
            get { return (Brush)GetValue(DigitalBlackgroundProperty); }
            set { SetValue(DigitalBlackgroundProperty, value); }
        }
        public Brush DigitalBrushFont
        {
            get { return (Brush)GetValue(DigitalBrushFontProperty); }
            set { SetValue(DigitalBrushFontProperty, value); }
        }
        public Brush DigitalPenBrush
        {
            get { return (Brush)GetValue(DigitalPenBrushProperty); }
            set { SetValue(DigitalPenBrushProperty, value); }
        }



        public double DigitalBrushThickness
        {
            get { return (double)GetValue(DigitalBrushThicknessProperty); }
            set { SetValue(DigitalBrushThicknessProperty, value); }
        }



        public double Radius
        {
            get { return (double)GetValue(RadiusProperty); }
            set { SetValue(RadiusProperty, value); }
        }





        static MydigitalEx()
        {
            DefaultStyleKeyProperty.OverrideMetadata(typeof(MydigitalEx), new FrameworkPropertyMetadata(typeof(MydigitalEx)));



            DigitalNumberProperty = DependencyProperty.Register("DigitalNumber", typeof(string), typeof(MydigitalEx),
                new PropertyMetadata(""));
            DigitalBlackgroundProperty = DependencyProperty.Register("DigitalBlackground", typeof(Brush), typeof(MydigitalEx),
                new PropertyMetadata(Brushes.Gold));

            DigitalBrushFontProperty = DependencyProperty.Register("DigitalBrushFont", typeof(Brush), typeof(MydigitalEx),
                new PropertyMetadata(Brushes.White));

            DigitalPenBrushProperty = DependencyProperty.Register("DigitalPenBrush", typeof(Brush), typeof(MydigitalEx),
                new PropertyMetadata(Brushes.Red));

            DigitalBrushThicknessProperty = DependencyProperty.Register("DigitalBrushThickness", typeof(double), typeof(MydigitalEx), new PropertyMetadata(1.0));

            RadiusProperty = DependencyProperty.Register("Radius", typeof(double), typeof(MydigitalEx), new PropertyMetadata(15.0));
        }
        #endregion




        protected override void OnMouseDoubleClick(MouseButtonEventArgs e)
        {
            base.OnMouseDoubleClick(e);
        }
        protected override void OnRender(DrawingContext dc)
        {
            base.OnRender(dc);
            if (DigitalNumber == "--")
                return;

            double len = Math.Min(ActualHeight, ActualWidth);
            Pen pen = new Pen(DigitalPenBrush, DigitalBrushThickness);

            //拆分数字
            string[] digitals = DigitalNumber.Split(new char[] { ',' });
            int n = digitals.Length;

            double digitalWidth = len;
            double totalRadius = len / 2;
            //double radius = totalRadius * 9 / 10;
            this.Width = Radius * n * 2;

            for (int i = 0; i < n; i++)
            {

                Point center = new Point((i + 0.5) * (Radius+2) * 2, len / 2);
                //画圆

                dc.DrawEllipse(DigitalBlackground, pen, center, Radius, Radius);

                //写字
                if (!string.IsNullOrEmpty(DigitalNumber))
                {
                    FormattedText text = new FormattedText(digitals[i], CultureInfo.CurrentCulture,
                       FlowDirection.LeftToRight, new Typeface("Verdana"), 14, DigitalBrushFont);
                    Point txtPoint = new Point(center.X - 9, center.Y - 8);
                    dc.DrawText(text, txtPoint);
                }
            }


        }
    }
}

二.前台实现

前端使用ListView进行布局,开奖号码使用有模板 ColAllDigital

<ListView x:Name="lst" d:DataContext="{d:DesignData Source=/SampleData/SampleData.xaml}" 
              FontSize="12" FontFamily="Verdana"
              ItemsSource="{Binding }">
        <ListView.View >
            <GridView>
                <GridViewColumn Header="期号"  DisplayMemberBinding="{Binding QiHao}" Width="80"/>
                <GridViewColumn Header="开奖号码" DisplayMemberBinding="{Binding Number}" Width="150" />

                <GridViewColumn Header="开奖号码"   Width=" 350"
                                 CellTemplate="{StaticResource ColAllDigital}"></GridViewColumn>
            </GridView>
        </ListView.View>  

ColAllDigital 模板定义如下

    <Window.Resources>
        <DataTemplate x:Key="ColAllDigital" d:IsDesignTimeCreatable="True" >
            <StackPanel Margin="5,2,5,2"  >
                <local:MydigitalEx x:Name="labelDigital" Width="130"  Height="30" HorizontalAlignment="Center"
                                   DigitalPenBrush="Red" 
                                   DigitalBlackground="White"
                                   DigitalBrushFont="Black"
                                   DigitalNumber="{Binding Path=Number}"></local:MydigitalEx>
            </StackPanel>
        </DataTemplate>
    </Window.Resources>

至此,就完成了基本实现.

demo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值