前言

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

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

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

功能说明

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

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

技术解析

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

1)ListView不同行颜色设定

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

  public class ListViewItemStyleSelector : StyleSelector
{
public override Style SelectStyle(object item,DependencyObject container)
{
Style st = new Style();
st.TargetType = typeof(ListViewItem);
Setter backGroundSetter = new Setter();
backGroundSetter.Property = ListViewItem.BackgroundProperty;
ListView listView =ItemsControl.ItemsControlFromItemContainer(container) as ListView;
int index =listView.ItemContainerGenerator.IndexFromContainer(container);
if (index % == )
{
backGroundSetter.Value = Brushes.LightGray;
}
else
{
backGroundSetter.Value = Brushes.White;
}
st.Setters.Add(backGroundSetter);
return st;
}
}

2)数字的显示

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

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

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

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

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

  public class CustomControl_digital : Control
{
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 static readonly DependencyProperty StrDigitalProperty; public static Color defaultColor = Color.FromRgb(, , );
Color BackColor { get; set; } = defaultColor;
public void SetBackColor(int index)
{
if (index == )
BackColor = defaultColor;
else
BackColor = Color.FromRgb(, , );
} public string StrDigital
{
get { return (string)GetValue(StrDigitalProperty); }
set { SetValue(StrDigitalProperty, value); }
} protected override void OnMouseDoubleClick(MouseButtonEventArgs e)
{
base.OnMouseDoubleClick(e);
}
protected override void OnRender(DrawingContext dc)
{
base.OnRender(dc);
if (StrDigital == "--")
return; double len = Math.Min(ActualHeight, ActualWidth);
Point center = new Point(ActualWidth / , ActualHeight / ); Pen pen = new Pen(Brushes.Black, );
Brush brush = new SolidColorBrush(BackColor); double totalRadius = len / ;
double radius = totalRadius * / ;
dc.DrawEllipse(brush, pen, center, radius, radius); if (!string.IsNullOrEmpty(StrDigital))
{
FormattedText text = new FormattedText(StrDigital, CultureInfo.CurrentCulture,
FlowDirection.LeftToRight, new Typeface("Verdana"), , Brushes.White);
Point txtPoint = new Point(center.X - , center.Y - );
dc.DrawText(text, txtPoint);
} }
}

技术交流联系qq 13712486

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

  1. WPF开发的彩票程序(练手好例子) 附源码

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

  2. Xamarin入门,开发一个简单的练手APP

    之前周末用Xamarin练手做了个简单APP,没有啥逻辑基本就是个界面架子,MVVM的简单使用,还有Binding,Command的简单使用,还有一个稍微复杂点两个界面交互处理(子页面新增后关闭,父页 ...

  3. 在VS2008.Net下使用WPF开发Web应用程序

    原文地址:http://hankjin.blog.163.com/blog/static/33731937200922353623434/ 胖客户端的好处是可以轻易的实现绚丽的效果, 而瘦客户端则需要 ...

  4. 适合Python的5大练手项目, 你练了么?

    在练手项目的选择上,还存在疑问?不知道要从哪种项目先下手? 首先有两点建议: 最好不要写太应用的程序练手,要思考什么更像是知识,老只会写写爬虫是无用的,但是完全不写也不行. 对于练手的程序,要注意简化 ...

  5. 【开源】前端练手笔记,Chrome扩展应用程序(html+CSS+JS) (1)

    项目名称:github-notification 项目地址:https://github.com/WQTeam/github-notification 说明:本人打算抽时间学习前端(html + cs ...

  6. 微信小程序初体验,入门练手项目--通讯录,部署上线(二)

    接上一篇<微信小程序初体验,入门练手项目--通讯录,后台是阿里云服务器>:https://www.cnblogs.com/chengxs/p/9898670.html 开发微信小程序最尴尬 ...

  7. 微信小程序初体验,入门练手项目--通讯录,后台是阿里云服务器(一)

    内容: 一.前言 二.相关概念 三.开始工作 四.启动项目起来 五.项目结构 六.设计理念 七.路由 八.部署线上后端服务 同步交流学习社区: https://www.mwcxs.top/page/4 ...

  8. NEXYS 3开发板练手--LED与数码管时钟

    做科研的时候从学校拿到一块基于Xilinx公司Spartan-6主芯片的FPGA开发板,因为之前一直在用Altera公司的FPGA,一开始接触它还真有点不太习惯.但毕竟核心的东西还是不会变的,于是按照 ...

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

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

随机推荐

  1. const define static extern 关键词详解

    const const关键词并不能把一个变量变成一个常量, 在符号前加上const表示这个符号不能被赋值, 即他的值对这个符号来说是只读的, 但并不代表这个值不能用其他方法去改变. 通过下面的例子就能 ...

  2. java web前端调试手段

    1.console.log() 2. jQuery.ajax({                     url:"/task1/com/guodiantong/servlet/JsonTo ...

  3. 移动端与PC端的viewport

    第一种解析: 设备像素,就是我们直觉上觉得"靠谱"的像素,这些像素为所使用的各种设备提供了正规的分辨率,并且其值可以通过(通常情况下)从screen.width/height属性中 ...

  4. [C#]SharpSSH-一个可以使用SSH连接的.NET库

    A Secure Shell (SSH) library for .NET 觉得有用,就记录下来了 http://www.tamirgal.com/blog/page/SharpSSH.aspx ht ...

  5. Debezium for PostgreSQL to Kafka

    In this article, we discuss the necessity of segregate data model for read and write and use event s ...

  6. 在Azure DevOps Server (TFS) 中修改团队项目名称

    概述 [团队项目]: 在Azure DevOps Server (原名TFS)中,团队项目(Team Project)是一个最基本的数据组织容器,包含了一个团队或者信息系统中的所有信息,包括源代码.文 ...

  7. Alwayson--配置只读请求

    场景:有三台服务器SQLNode131,SQLNode132 ,SQLNode133: 1) 三台服务器加入域DCDemo.com 2) 三台服务器使用端口访问数据库 3) 三台服务器构建故障转移群集 ...

  8. 【NumberValidators】增值税发票代码验证

    同大陆身份证验证一样,该部分是按照国家增值税发票代码的定制规则,进行发票代码验证,如果需要查验发票信息是否正确,应该通过第三方接口(大约一毛钱查验一次),或者直接上国家税务总局全国增值税发票查验平台进 ...

  9. .net core 读取本地指定目录下的文件

    项目需求 asp.net core 读取log目录下的.log文件,.log文件的内容如下: xxx.log ------------------------------------------beg ...

  10. winform中控件的简单数据绑定

    是因为在学习组件开发过程中有个Bindable的属性,不明白意义,然后才接触到winform的数据绑定,想着先把数据绑定这块看一下,然后去测试下是否Bindable属性设为false,就不能绑定该属性 ...