彩票历史记录分析工具 -- 通过实例学习wpf开发

前言 虽然本人对彩票不感兴趣,仍然有不少人对此情有独钟。他们花大量时间精力去分析彩票的历史记录,企图发现规律,为下一次投注做指导,希望“赢的“”概率增大。不管研究历史记录是否有意义,我用软件实现了对彩票的分析,手工分析彩票几天工作量,现在一秒可以实现。

执行程序,点我下载!

程序界面

处理原理分析

程序实际上是对六合彩分析(彩票种类很多,本文只处理一种)。数据格式如下:

2010001 11 13 22 16 21 18
2010002 22 28 16 5 14 26
2010003 5 14 45 48 16 25

每期6个号,任选3个号,如果6个号中包含该3个号,该期算中奖了。

彩票数值范围为1--49,每期都是6选3. 每次投注3个号,所有的投注可能性有18424次,从概率上讲,每次投注中奖的可能性是18424分之1.

软件就是分析选哪三个号中奖概率最大。是根据历史记录统计分析,找出历史记录上哪些号码出现次数多。

 彩票历史记录界面 

这是ListView控件,显示彩票历史记录。如何显示这样的界面?这种类型的界面非常适用MVVM模式展示。你准备数据和显示模板,剩下的事由ListView来做。

ListView需要绑定的数据定义如下:

 1  public class ListViewBindingItem
 2     {
 3         public string Index { get; set; } //序号
 4         public string RecordNO { get; set; } //期数
 5         public string[] Digital { get; set; }
 6         public RecordItemInFile RecordItem { get; internal set; }
 7
 8         public int ValueIndexOf(string value)
 9         {
10             for (int i = 0; i < Digital.Length; i++)
11             {
12                 if (Digital[i] == value)
13                 {
14                     return i;
15                 }
16             }
17             return -1;
18         }
19
20         public string StrDigital
21         {
22             get
23             {
24                 return string.Format("{0} {1} {2} {3} {4} {5}",
25                     Digital[0], Digital[1], Digital[2],
26                     Digital[3], Digital[4], Digital[5]);
27             }
28         }
29
30     }

这个类型的定义与界面密切相关,与asp.net 中的ViewMode概念相似。如果界面只是显示字符串,把数据绑定到ListView就大功告成。但是我们想把彩票中的数字显示在圆形背景中,这时候就需要用到数据模板DataTemplate。数据模板的输入是数据和模板,输出就是你想要的界面。模板就是定义数据怎么显示的。如何处理数据如何显示有很多种方法,我只举其中一种。注:每种显示效果可能都会有多种处理方法,这是WPF的灵活性,也是wpf让人困惑的地方。

ListView XAML定义如下

   <ListView  MinHeight="260" BorderThickness="1,1,1,1"
                      VirtualizingPanel.IsVirtualizing="True"
                       Grid.Row="0" x:Name="lvAllDigital" >
                <ListView.View>
                    <GridView >
                        <GridViewColumn Header="序号" Width="90" DisplayMemberBinding="{Binding Path=Index}"></GridViewColumn>
                        <GridViewColumn Header="期数" Width="110" DisplayMemberBinding="{Binding Path=RecordNO}"></GridViewColumn>
                        <GridViewColumn Header="1列"  Width="55"
                                        CellTemplate="{StaticResource ColDigital1}"></GridViewColumn>
                        <GridViewColumn Header="2列" Width="55" CellTemplate="{StaticResource ColDigital2}"></GridViewColumn>
                        <GridViewColumn Header="3列" Width="55" CellTemplate="{StaticResource ColDigital3}"></GridViewColumn>
                        <GridViewColumn Header="4列" Width="55" CellTemplate="{StaticResource ColDigital4}"></GridViewColumn>
                        <GridViewColumn Header="5列" Width="55" CellTemplate="{StaticResource ColDigital5}"></GridViewColumn>
                        <GridViewColumn Header="6列" Width="55" CellTemplate="{StaticResource ColDigital6}"></GridViewColumn>
                    </GridView>
                </ListView.View>
            </ListView>

数字显示的模板定义如下:

<DataTemplate x:Key="ColDigital1" >
            <StackPanel Margin="5,2,5,2" HorizontalAlignment="Center" Width="180">
                <local:CustomControl_digital x:Name="labelDigital1" Width="30" Height="30"
                                             StrDigital="{Binding Path=Digital[0]}"></local:CustomControl_digital>
            </StackPanel>
        </DataTemplate>
CustomControl_digital类是一个自定义控件,这个控件就是根据输入的数字,显示圆形背景图像。这个处理也很简单。
public class CustomControl_digital : Control
    {
        public static readonly DependencyProperty StrDigitalProperty;
        public static Color defaultColor = Color.FromRgb(41, 57, 85);

        Color BackColor { get; set; } = defaultColor;

        static CustomControl_digital()
        {
            StrDigitalProperty =
          DependencyProperty.Register("StrDigital", //属性名称
          typeof(string), //属性类型
          typeof(CustomControl_digital), //该属性所有者,即将该属性注册到那个类上
          new PropertyMetadata("")); //属性默认值
            DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl_digital), new FrameworkPropertyMetadata(typeof(CustomControl_digital)));
        }

        public void SetBackColor(int index)
        {
            if (index == 0)
                BackColor = defaultColor;
            else
                BackColor = Color.FromRgb(62, 175, 14);
        }

        public int Row { get; set; } = -1;
        public int Column { get; set; }
        public string StrDigital_old { get; set; }
        public string StrDigital
        {
            get { return (string)GetValue(StrDigitalProperty); }
            set { SetValue(StrDigitalProperty, value); }
        }

        static Dictionary<Brush, Pen> _colorToPenGroup = new Dictionary<Brush, Pen>();
        public static Pen GetPen(Brush color)
        {
            if(_colorToPenGroup.TryGetValue(color,out Pen pen))
            {
                return pen;
            }

            Pen pen2 = new Pen(color, 0);
            pen2.Freeze();
            _colorToPenGroup.Add(color, pen2);
            return pen2;
        }

        static Dictionary<Color, SolidColorBrush> _colorToBrushGroup = new Dictionary<Color, SolidColorBrush>();
        public static SolidColorBrush GetBrush(Color color)
        {
            if (_colorToBrushGroup.TryGetValue(color, out SolidColorBrush brush))
            {
                return brush;
            }

            SolidColorBrush newBrush = new SolidColorBrush(color);
            newBrush.Freeze();
            _colorToBrushGroup.Add(color, newBrush);
            return newBrush;
        }

        protected override void OnRender(DrawingContext dc)
        {

            base.OnRender(dc);
            if (StrDigital == "--")
                return;

            double len = Math.Min(ActualHeight, ActualWidth);
            Point center = new Point(ActualWidth / 2, ActualHeight / 2);

            Pen pen = GetPen(Brushes.Black);
            Brush brush =  GetBrush(BackColor);

            double totalRadius = len / 2;
            double radius = totalRadius * 9 / 10;
            dc.DrawEllipse(brush, pen, center, radius, radius);

            if (!string.IsNullOrEmpty(StrDigital))
            {
                FormattedText text = new FormattedText(StrDigital, CultureInfo.CurrentCulture,
                        FlowDirection.LeftToRight, new Typeface("Verdana"), 14, Brushes.White);
                Point txtPoint = new Point(center.X - 9, center.Y - 8);
                dc.DrawText(text, txtPoint);
            }
        }
    }

因为需要绑定数据,所以需要定义依赖属性。需要重载函数 protected override void OnRender(DrawingContext dc),在这个函数中处理显示。

 彩票中奖结果界面

这个也是ListView控件,只是数据模板定义不一样。数据模板定义如下:

 <DataTemplate x:Key="keyDigitalView" >
            <StackPanel Margin="5,2,5,2" HorizontalAlignment="Center" Width="180">
                <local:UserControl_DigitalView x:Name="digitalView"
                      StrDigital="{Binding Path=StrDigital}"
                      StrHighlight="{Binding Path=StrHighlight}">
                </local:UserControl_DigitalView>
            </StackPanel>
        </DataTemplate>

要显示这样的效果需要知道两个参数:1 需要显示哪些数字,2 哪些数字需要绿色背景。这两个参数是 StrDigital,StrHighlight。我们生成用户控件,同时定义这两个参数;为了可以绑定,参数必须定义为依赖属性。

UserControl_DigitalView控件定义如下:
public partial class UserControl_DigitalView : UserControl
    {
        public static readonly DependencyProperty StrDigitalProperty;
        public static readonly DependencyProperty StrHighlightProperty;

        static UserControl_DigitalView()
        {
            StrDigitalProperty =
            DependencyProperty.Register("StrDigital", //属性名称
            typeof(string), //属性类型
            typeof(UserControl_DigitalView), //该属性所有者,即将该属性注册到那个类上
            new PropertyMetadata("")); //属性默认值

            StrHighlightProperty =
                DependencyProperty.Register("StrHighlight", //属性名称
                typeof(string), //属性类型
                typeof(UserControl_DigitalView), //该属性所有者,即将该属性注册到那个类上
                new PropertyMetadata("")); //属性默认值

            // DefaultStyleKeyProperty.OverrideMetadata(typeof(UserControl_DigitalView),
            // new FrameworkPropertyMetadata(typeof(UserControl_DigitalView)));

        }

        public string StrDigital
        {
            get { return (string)GetValue(StrDigitalProperty); }
            set { SetValue(StrDigitalProperty, value); }
        }

        public string StrHighlight
        {
            get { return (string)GetValue(StrHighlightProperty); }
            set { SetValue(StrHighlightProperty, value); }
        }

        public UserControl_DigitalView()
        {
            InitializeComponent();
        }

        private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {
            ShowView();
        }

        Run GetRun(string digital, string[] digitalHighlight)
        {
            Run run = new Run();
            int count = digitalHighlight.Where(o => o == digital).Count();
            if (count > 0)
            {
                run.Background = Brushes.Green;
                run.Foreground = Brushes.White;
            }
            run.Text = digital;
            return run;
        }

        private void ShowView()
        {
            string[] digitals = StrDigital.Split(new char[] { ‘ ‘ }, StringSplitOptions.RemoveEmptyEntries);
            string[] digitalHighlight = StrHighlight.Split(new char[] { ‘ ‘ }, StringSplitOptions.RemoveEmptyEntries);

            foreach (string digital in digitals)
            {
                txtDigital.Inlines.Add(GetRun(digital, digitalHighlight));
                txtDigital.Inlines.Add(" ");
            }
        }
    }

txtDigital是TextBlock控件,该控件的Inlines属性可以包含不同字体属性的文字片段。我们需要根据StrDigital,StrHighlight参数填充这些片段。

后记 WPF非常重要的概念就是绑定和模板,这是MVVM模式具体的体现。WPF的控件其实并不多,可能还没WinForm多,但是wpf控件都是可定制的。控件只是定义行为(相当于业务逻辑),控件外观都是可定制,wpf控件可以以一当十;所以一个框架的好坏以控件多少来评判是不公平。本人用业余时间两天开发完成这个程序,可见WPF开发的效率和灵活性之高。

原文地址:https://www.cnblogs.com/yuanchenhui/p/12114117.html

时间: 2024-10-08 21:56:24

彩票历史记录分析工具 -- 通过实例学习wpf开发的相关文章

OFD电子证照模版制作工具 --(采用wpf开发)

前言  ofd应用的范围非常广,电子证照是其中非常重要的一个应用.同一类电子证照具有相同的板式.元数据:所以电子证照非常适合用模版来制作.模版就是板式样式固定,每个具体的证照只是文字或图片内容不同.比如结婚证,包含持证人.登记日期等,这些元素在界面的位置是固定的.作者设计了一款软件,可以方便的编辑这类模版,根据模版再生成电子证照,采用这种方式可以快速开发各类电子证照. 程序界面  设计思路 数据分为两种类型:文字和图片.对于文字,可以移动位置.设置字体.字号等.对于图片,可以移动位置.缩放等.板

工欲善其事,必先利其器 之 WPF篇: 随着开发轨迹来看高效WPF开发的工具和技巧

原文:工欲善其事,必先利其器 之 WPF篇: 随着开发轨迹来看高效WPF开发的工具和技巧 之前一篇<工欲善其事,必先利其器.VS2013全攻略(安装,技巧,快捷键,插件)!> 看到很多朋友回复和支持,非常感谢,尤其是一些拍砖的喷油,感谢你们的批评,受益良多. 我第一份工作便是WPF的开发,一直到现在都非常喜欢这门技术,从懵懵懂懂到现在有一些WPF开发资历,也算是经历了一段坎坷的过程.我的朋友看到我写了VS2013的全攻略,他就推荐我写一个WPF篇,我想了下,的确很多朋友初接触WPF的时候难免会

Cacti 是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形分析工具

Cacti 是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形分析工具. mysqlreport是mysql性能监测时最常用的工具,对了解mysql运行状态和配置调整都有很大的帮助. mysqlsla是hackmysql.com推出的一款MySQL的日志分析工具,功能非常强大. 数据报表,非常有利于分析慢查询的原因, 包括执行频率, 数据量, 查询消耗等. http://www.kxtry.com/archives/338

开发与测试分析工具集锦(网络摘要)不断更新

一.测试工具 (一)软件测试工具 (二)网络分析工具 1.TcpDump工具(网络安全分析工具 ):抓包分析                     tcpdump 是一个运行在命令行下的嗅探工具.它允许用户拦截和显示发送或收到过网络连接到该计算机的TCP/IP和其他数据包.tcpdump 是一个在BSD许可证下发布的自由软件.                     tcpdump是非常强大的网络安全分析工具,可以将网络上截获的数据包保存到文件以备分析.可以定义过滤规则,只截获感兴趣的数据包,

Stimulsoft Reports.Wpf是针对WPF开发的报表工具控件

Stimulsoft Reports.Wpf是针对WPF开发的报表工具控件.无需上网,所有的WPF功能都能用上!丰富的界面更换功能.查看功能.打印以及导出报表功能——所有的这一切就是它都能轻松实现. 创建Stimulsoft Reports.Wpf是基于Stimulsoft团队多年开发以及使用的报表引擎来创建报表.只需简单的几行代码即可执行报表复杂的操作,报表引擎提供了创建报表的许多功能.大量的组件开发包,独特的一套属性和参数,精心构思的报表体系.很多选项都是绝对独特且仅出现该产品中.Stimu

app运营分析工具-诸葛IO介绍

诸葛IO,是一款基于用户洞察的精细化运营分析工具.以先进的用户跟踪技术和简单易用的集成开发方法,帮助移动应用的运营者们挖掘用户的真实行为与属性.借助数据,App的开发者和运营者们,将获得前所未有的,直接.客观.高效的用户行为洞察方式.诸葛目前已覆盖iOS.安卓及JS平台. 诸葛IO数据分析工具目前拥有五大功能点:用户行为洞察.自定义用户分组.精细化事件管理.独立模块的留存分析和个性化精准送达.那么如何利用诸葛IO数据分析工具做数据分析呢? 用户行为洞察 诸葛IO的"用户档案"功能提供了

java代码分析及分析工具

java代码分析及分析工具 一个项目从搭建开始,开发的初期往往思路比较清晰,代码也比较清晰.随着时间的推移,业务越来越复杂.代码也就面临着耦合,冗余,甚至杂乱,到最后谁都不敢碰. 作为一个互联网电子商务网站的业务支撑系统,业务复杂不言而喻.从09年开始一直沿用到现在,中间代码经过了多少人的手,留下了多少的坑,已经记不清楚了,谁也说不清了. 代码的维护成本越来越高.代码已经急需做调整和改善.最近项目组专门设立了一个小组,利用业余时间做代码分析的工作,目标对核心代码进行分析并进行设计重构. 代码分析

MySQL监控、性能分析——工具篇

MySQL越来越被更多企业接受,随着企业发展,MySQL存储数据日益膨胀,MySQL的性能分析.监控预警.容量扩展议题越来越多.“工欲善其 事,必先利其器”,那么我们如何在进行MySQL性能分析.监控预警.容量扩展问题上得到更好的解决方案,就要利用各种工具来对MySQL各种指标进行分 析.本文是读书笔记,下面提及的工具,读者可能都用过,或打算准备是使用.MySQL服务器的发布包没有包含那些能完成许多常见任务的工具,例如监控服务器的工具.比较服务器间数据的工具.我们把这些工具分成以下几类:界面.监

JS内存泄漏 和Chrome 内存分析工具简介(摘)

原文地址:http://web.jobbole.com/88463/ JavaScript 中 4 种常见的内存泄露陷阱 原文:Sebastián Peyrott 译文:伯乐在线专栏作者 - ARIGATO 链接:http://web.jobbole.com/88463/ 点击 → 了解如何加入专栏作者 了解 JavaScript 的内存泄露和解决方式! 在这篇文章中我们将要探索客户端 JavaScript 代码中常见的一些内存泄漏的情况,并且学习如何使用 Chrome 的开发工具来发现他们.读