前言

WPF是.NET最新的界面开发库,开发界面非常灵活!但是学习WPF难度也非常大。

应朋友之邀,编写了一个小程序。程序虽小,五脏俱全,WPF开发的灵活性可窥见一斑。

对于新手学习有很好的借鉴意义,代码已上传到CSDN可以下载。网址见文章底部。

功能说明

分析彩票的历史记录,根据选取的几个数据,分析记录出现的情况。看下图。

左边是历史记录,右边 是选取的数据 68、 8*。从历史记录查找,符合这个逻辑关系的数据。

技术解析

我这里分析几个小技术点。

1)ListView不同行颜色设定

ListView 有一个属性 ItemContainerStyleSelector,这个属性可以绑定到一个类,你可以在这个类中,根据每行的属性,设定背景。

  1. public class ListViewItemStyleSelector : StyleSelector
  2. {
  3. public override Style SelectStyle(object item,DependencyObject container)
  4. {
  5. Style st = new Style();
  6. st.TargetType = typeof(ListViewItem);
  7. Setter backGroundSetter = new Setter();
  8. backGroundSetter.Property = ListViewItem.BackgroundProperty;
  9. ListView listView =ItemsControl.ItemsControlFromItemContainer(container) as ListView;
  10. int index =listView.ItemContainerGenerator.IndexFromContainer(container);
  11. if (index % == )
  12. {
  13. backGroundSetter.Value = Brushes.LightGray;
  14. }
  15. else
  16. {
  17. backGroundSetter.Value = Brushes.White;
  18. }
  19. st.Setters.Add(backGroundSetter);
  20. return st;
  21. }
  22. }

2)数字的显示

ListView 每一列,可以绑定字符串,也可以根据需要绑定控件模版。

  1. <GridView >
  2. <GridViewColumn Header="序号" Width="" DisplayMemberBinding="{Binding Path=StrNO}"></GridViewColumn>
  3. <GridViewColumn Header="日期" Width="" DisplayMemberBinding="{Binding Path=StrTimeStamp}"></GridViewColumn>
  4. <GridViewColumn Header="期数" Width="" DisplayMemberBinding="{Binding Path=StrVolume}"></GridViewColumn>
  5. <GridViewColumn Header="1列" Width="" CellTemplate="{StaticResource ColDigital1}"></GridViewColumn>
  6. <GridViewColumn Header="2列" Width="" CellTemplate="{StaticResource ColDigital2}"></GridViewColumn>
  7. <GridViewColumn Header="3列" Width="" CellTemplate="{StaticResource ColDigital3}"></GridViewColumn>
  8. <GridViewColumn Header="4列" Width="" CellTemplate="{StaticResource ColDigital4}"></GridViewColumn>
  9. <GridViewColumn Header="5列" Width="" CellTemplate="{StaticResource ColDigital5}"></GridViewColumn>
  10. <GridViewColumn Header="6列" Width="" CellTemplate="{StaticResource ColDigital6}"></GridViewColumn>
  11. <GridViewColumn Header="7列" Width="" CellTemplate="{StaticResource ColDigital7}"></GridViewColumn>
  12. </GridView>

数字是静态绑定到 ColDigital1,ColDigital2...等,咱看看ColDigital1如何实现的。

  1. <DataTemplate x:Key="ColDigital1" >
  2. <StackPanel Margin="5,2,5,2" HorizontalAlignment="Center" Width="">
  3. <local:CustomControl_digital x:Name="labelDigital1" Width="" Height="" StrDigital="{Binding Path=StrCol1}"></local:CustomControl_digital>
  4. </StackPanel>
  5. </DataTemplate>

StackPanel 包含了一个自定义控件CustomControl_digital,这个自定控件实现了对数字的绘制。ListView 绑定一个类,这个类有属性字段StrCol1;自定义控件就从StrCol1获取数据绘制。

  1. public class CustomControl_digital : Control
  2. {
  3. static CustomControl_digital()
  4. {
  5. StrDigitalProperty =
  6. DependencyProperty.Register("StrDigital", //属性名称
  7. typeof(string), //属性类型
  8. typeof(CustomControl_digital), //该属性所有者,即将该属性注册到那个类上
  9. new PropertyMetadata("")); //属性默认值
  10.  
  11. DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomControl_digital), new FrameworkPropertyMetadata(typeof(CustomControl_digital)));
  12. }
  13.  
  14. public static readonly DependencyProperty StrDigitalProperty;
  15.  
  16. public static Color defaultColor = Color.FromRgb(, , );
  17. Color BackColor { get; set; } = defaultColor;
  18. public void SetBackColor(int index)
  19. {
  20. if (index == )
  21. BackColor = defaultColor;
  22. else
  23. BackColor = Color.FromRgb(, , );
  24. }
  25.  
  26. public string StrDigital
  27. {
  28. get { return (string)GetValue(StrDigitalProperty); }
  29. set { SetValue(StrDigitalProperty, value); }
  30. }
  31.  
  32. protected override void OnMouseDoubleClick(MouseButtonEventArgs e)
  33. {
  34. base.OnMouseDoubleClick(e);
  35. }
  36. protected override void OnRender(DrawingContext dc)
  37. {
  38. base.OnRender(dc);
  39. if (StrDigital == "--")
  40. return;
  41.  
  42. double len = Math.Min(ActualHeight, ActualWidth);
  43. Point center = new Point(ActualWidth / , ActualHeight / );
  44.  
  45. Pen pen = new Pen(Brushes.Black, );
  46. Brush brush = new SolidColorBrush(BackColor);
  47.  
  48. double totalRadius = len / ;
  49. double radius = totalRadius * / ;
  50. dc.DrawEllipse(brush, pen, center, radius, radius);
  51.  
  52. if (!string.IsNullOrEmpty(StrDigital))
  53. {
  54. FormattedText text = new FormattedText(StrDigital, CultureInfo.CurrentCulture,
  55. FlowDirection.LeftToRight, new Typeface("Verdana"), , Brushes.White);
  56. Point txtPoint = new Point(center.X - , center.Y - );
  57. dc.DrawText(text, txtPoint);
  58. }
  59.  
  60. }
  61. }

技术交流联系qq 13712486

WPF开发的彩票程序(练手好例子) 附源码的更多相关文章

  1. ASP.NET程序读取二代身份证(附源码)

    原文:ASP.NET程序读取二代身份证(附源码) 一般来说winform应用程序解决这个问题起来时很容易的,web应用程序就麻烦一点了. 这里我说说我的解决思路: 一.你必要有联机型居民身份证阅读器一 ...

  2. 微信小程序之蓝牙开发(详细读数据、写数据、附源码)

    本文将详细介绍微信小程序的蓝牙开发流程(附源码)准备:微信只支持低功耗蓝牙也就是蓝牙4.0,普通的蓝牙模块是用不了的,一定要注意. 蓝牙可以连TTL接到电脑上,再用XCOM调试 一开始定义的变量 va ...

  3. WPF开发的彩票程序(练手好例子)

    前言 WPF是.NET最新的界面开发库,开发界面非常灵活!但是学习WPF难度也非常大. 应朋友之邀,编写了一个小程序.程序虽小,五脏俱全,WPF开发的灵活性可窥见一斑. 对于新手学习有很好的借鉴意义, ...

  4. 快速开发架构Spring Boot 从入门到精通 附源码

    导读 篇幅较长,干货十足,阅读需花费点时间.珍惜原创,转载请注明出处,谢谢! Spring Boot基础 Spring Boot简介 Spring Boot是由Pivotal团队提供的全新框架,其设计 ...

  5. WPF一步步实现完全无边框自定义Window(附源码)

    在我们设计一个软件的时候,有很多时候我们需要按照美工的设计来重新设计整个版面,这当然包括主窗体,因为WPF为我们提供了强大的模板的特性,这就为我们自定义各种空间提供了可能性,这篇博客主要用来介绍如何自 ...

  6. openlayers5-webpack 入门开发系列结合 turf.js 实现等值线(附源码下载)

    前言 openlayers5-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载 ...

  7. Java开发简单的家居购物商城系统 JSP 附源码

    开发环境:    Windows操作系统开发工具: MyEclipse+Jdk+Tomcat+MYSQL数据库 注意:使用tomcat7运行 运行效果图 源码及原文链接:https://javadao ...

  8. openlayers4 入门开发系列之地图标绘篇(附源码下载)

    前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...

  9. openlayers4 入门开发系列之地图模态层篇(附源码下载)

    前言 openlayers4 官网的 api 文档介绍地址 openlayers4 api,里面详细的介绍 openlayers4 各个类的介绍,还有就是在线例子:openlayers4 官网在线例子 ...

随机推荐

  1. JS中replace()用法举例

    语法: string.replace(regexp,replacement) 参数: regexp:声明了要替换的模式的RegExp对象.如果该参数是一个字符串,则将它作为要检索的直接量文本模式,而不 ...

  2. Myeclipse10连接SqlServer2012

    本文纯手打!!!! 对于我们这些刚学java的小白,可是真费劲啊!!!! 要用java连接数据库  首先是要通过JDBC驱动 要先去下载一个sqljdbc4.jar,我这里放百度云盘了, 下载地址:链 ...

  3. 实现一个单隐层神经网络python

    看过首席科学家NG的深度学习公开课很久了,一直没有时间做课后编程题,做完想把思路总结下来,仅仅记录编程主线. 一 引用工具包 import numpy as np import matplotlib. ...

  4. js文件中使用EL表达式的问题

    var str = '${str}' ; var str = '${obj.属性名}'; 只可以再jsp页面的<script></script>中使用,外部引入的js文件中不能 ...

  5. myeclipse10破解失败,正解

    此文图借用他人的,很是经典 第一步:输入任意用户名 第二步:点击Systemid... 按钮,自动生成本机器的systemid.ps:确定本机的systemid,如果和破解器生成不一致,需要copy本 ...

  6. 转载——yum源的超级简单配置

    1.先挂载光盘. 使用命令"mount  -o  loop  /dev/sr0 /mnt/cdrom".如果使用命令"mount -o  loop  /dev/cdrom ...

  7. Ubuntu配置OpenStack 二:配置时间同步NTP和安装数据库Maridb以及问题总结

    继上一节Ubuntu配置OpenStack 一:配置主机环境,下面继续为安装时间同步,以及配置openstack的安装包源和安装数据库Maridb.(全文截图都是由自己徒手搭建完成并且截图) 一.安装 ...

  8. Toxophily

    Problem Description The recreation center of WHU ACM Team has indoor billiards, Ping Pang, chess and ...

  9. AngularJS学习篇(六)

    AngularJS 控制器 AngularJS 应用程序被控制器控制. ng-controller 指令定义了应用程序控制器. 控制器是 JavaScript 对象,由标准的 JavaScript 对 ...

  10. 【前端】跨浏览器事件处理程序EventUtil.js个人注释及详解

    <javascript高级程序设计>跨浏览器事件处理程序EventUtil.js个人注释 EventUtil.js // 跨浏览器事件处理程序封装 var EventUtil = { // ...