WPF開發的彩票程序(練手好例子)


前言

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 % 2 == 0)
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="50" DisplayMemberBinding="{Binding Path=StrNO}"></GridViewColumn>
 3                             <GridViewColumn Header="日期" Width="120" DisplayMemberBinding="{Binding Path=StrTimeStamp}"></GridViewColumn>
 4                             <GridViewColumn Header="期數" Width="110" DisplayMemberBinding="{Binding Path=StrVolume}"></GridViewColumn>
 5                             <GridViewColumn Header="1列"  Width="55" CellTemplate="{StaticResource ColDigital1}"></GridViewColumn>
 6                             <GridViewColumn Header="2列" Width="55" CellTemplate="{StaticResource ColDigital2}"></GridViewColumn>
 7                             <GridViewColumn Header="3列" Width="55" CellTemplate="{StaticResource ColDigital3}"></GridViewColumn>
 8                             <GridViewColumn Header="4列" Width="55" CellTemplate="{StaticResource ColDigital4}"></GridViewColumn>
 9                             <GridViewColumn Header="5列" Width="55" CellTemplate="{StaticResource ColDigital5}"></GridViewColumn>
10                             <GridViewColumn Header="6列" Width="55" CellTemplate="{StaticResource ColDigital6}"></GridViewColumn>
11                             <GridViewColumn Header="7列" Width="55" CellTemplate="{StaticResource ColDigital7}"></GridViewColumn>
12   </GridView>

   數字是靜態綁定到 ColDigital1,ColDigital2...等,咱看看ColDigital1如何實現的。

1  <DataTemplate x:Key="ColDigital1" >
2             <StackPanel Margin="5,2,5,2" HorizontalAlignment="Center" Width="180">
3                 <local:CustomControl_digital x:Name="labelDigital1" Width="30" Height="30" 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(41, 57, 85);
17         Color BackColor { get; set; } = defaultColor;
18         public void SetBackColor(int index)
19         {
20             if (index == 0)
21                 BackColor = defaultColor;
22             else
23                 BackColor = Color.FromRgb(62, 175, 14);
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 / 2, ActualHeight / 2);
44 
45             Pen pen = new Pen(Brushes.Black, 0);
46             Brush brush = new SolidColorBrush(BackColor);
47 
48             double totalRadius = len / 2;
49             double radius = totalRadius * 9 / 10;
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"), 14, Brushes.White);
56                 Point txtPoint = new Point(center.X - 9, center.Y - 8);
57                 dc.DrawText(text, txtPoint);
58             }
59 
60         }
61     }

 

技術交流聯系qq 13712486

   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM