前言
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