<UserControl x:Class="SL_DianTiShow.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" xmlns:local="clr-namespace:SL_DianTiShow" d:DesignHeight="300" d:DesignWidth="400" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" Loaded="UserControl_Loaded"> <Grid x:Name="LayoutRoot" Background="White" > <Grid.RowDefinitions> <RowDefinition Height="*" /> <RowDefinition Height="*" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <Grid.Resources> <local:ScoreColorConverter x:Key="ScoreColorConverter" /> <Style x:Key="CenterText" TargetType="TextBlock"> <Setter Property="TextAlignment" Value="Center" /> </Style> </Grid.Resources> <!--<sdk:DataGrid AutoGenerateColumns="False" Height="162" HorizontalAlignment="Left" Margin="25,59,0,0" Name="dg" VerticalAlignment="Top" Width="705" Grid.ColumnSpan="2" /> <Button Content="Update" Height="23" HorizontalAlignment="Left" Margin="167,243,0,0" Name="btn_Update" VerticalAlignment="Top" Width="75" Click="btn_Update_Click" /> <TextBox Height="23" HorizontalAlignment="Left" Margin="10,15,0,0" Name="my_text" VerticalAlignment="Top" Width="120" />--> <sdk:DataGrid Margin="2" Name="dg1" AutoGenerateColumns="False" Grid.ColumnSpan="2"> <sdk:DataGrid.Columns> <sdk:DataGridTextColumn Header="SN" Binding="{Binding SN}"/> <sdk:DataGridTemplateColumn Header="ScoreA"> <sdk:DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding ScoreA}" Foreground="{Binding ScoreA, Converter={StaticResource ScoreColorConverter}}" TextAlignment="Center" /> </DataTemplate> </sdk:DataGridTemplateColumn.CellTemplate> </sdk:DataGridTemplateColumn> <sdk:DataGridTemplateColumn Header="ScoreB"> <sdk:DataGridTemplateColumn.CellTemplate> <DataTemplate> <TextBlock Text="{Binding ScoreB}" Foreground="{Binding ScoreB, Converter={StaticResource ScoreColorConverter}}" TextAlignment="Center" /> </DataTemplate> </sdk:DataGridTemplateColumn.CellTemplate> </sdk:DataGridTemplateColumn> </sdk:DataGrid.Columns> </sdk:DataGrid> <sdk:DataGrid Margin="2" Name="dg2" AutoGenerateColumns="False" Grid.Row="1" Grid.ColumnSpan="2"> <sdk:DataGrid.Columns> <sdk:DataGridTextColumn Header="SN" Binding="{Binding SN}" /> <sdk:DataGridTextColumn Header="ScoreA" Binding="{Binding ScoreA}" ElementStyle="{StaticResource CenterText}" /> <sdk:DataGridTextColumn Header="ScoreB" Binding="{Binding ScoreB}" ElementStyle="{StaticResource CenterText}" /> </sdk:DataGrid.Columns> </sdk:DataGrid> <sdk:DataGrid Margin="2" Name="dg3" Grid.Row="2" AutoGenerateColumns="False"> <sdk:DataGrid.Columns> <sdk:DataGridTextColumn Header="SN" Binding="{Binding SN}" /> <local:ScoreColumn Header="ScoreA" Binding="{Binding ScoreA}" /> <local:ScoreColumn Header="ScoreB" Binding="{Binding ScoreB}" /> </sdk:DataGrid.Columns> </sdk:DataGrid> </Grid> </UserControl>
后台代码
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Shapes; using System.Windows.Threading; using System.Reflection; using System.Globalization; using System.Windows.Data; namespace SL_DianTiShow { public partial class MainPage : UserControl { DispatcherTimer myTimer = new DispatcherTimer(); int i = 0; bool myState = true; // SR_WCF.ServiceClient tempSR = new SR_WCF.ServiceClient(); List<SimData> data = new List<SimData>(); public MainPage() { InitializeComponent(); // btn_Update.Content = "start"; //myTimer.Interval = new TimeSpan(0, 0, 0, 1); //myTimer.Tick += new EventHandler(myTimer_Tick); //tempSR.GetDianTiAllInfoByAccountCompleted += new EventHandler<SR_WCF.GetDianTiAllInfoByAccountCompletedEventArgs>(tempSR_GetDianTiAllInfoByAccountCompleted); } void myTimer_Tick(object sender, EventArgs e) { // my_text.Text = i++.ToString(); //throw new NotImplementedException(); // tempSR.GetDianTiAllInfoByAccountAsync("demo"); } private void btn_Update_Click(object sender, RoutedEventArgs e) { // SheBei_Access tempSheBeiAcs = new SheBei_Access(); // dg.AutoGenerateColumns = true; // dg.ItemsSource = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss").Split(); //if (myState) //{ // myTimer.Start(); // btn_Update.Content = "stop"; //} //else //{ // myTimer.Stop(); // btn_Update.Content = "start"; //} //myState = !myState; } void tempSR_GetDianTiAllInfoByAccountCompleted(object sender, SR_WCF.GetDianTiAllInfoByAccountCompletedEventArgs e) { // dg.ItemsSource = (DataTable)e.Result; //throw new NotImplementedException(); if (e.Error != null) { MessageBox.Show(e.Error.Message + e.Error.StackTrace); } else { Silverlight.DataSet ds = new Silverlight.DataSet(); ds.FromXml(e.Result); //DataContext // dg.ItemsSource = ds.Tables[0].GetBindableData(new Silverlight.Connector()); } } private void UserControl_Loaded(object sender, RoutedEventArgs e) { //以亂數摸擬資料 Random rnd = new Random(); for (int i = 0; i < 100; i++) { data.Add(new SimData() { SN = i.ToString("00000"), ScoreA = 100 - rnd.Next(199), ScoreB = 100 - rnd.Next(199) }); } //方法1: 使用DataGridTemplateColumn + IValueConverter dg1.ItemsSource = data; #region 方法2: 利用LoadingRow事件加工 SolidColorBrush normal = new SolidColorBrush(Colors.Green); SolidColorBrush negative = new SolidColorBrush(Colors.Red); dg2.LoadingRow += (s, o) => { //o為DataGridRowEventArgs SimData sd = o.Row.DataContext as SimData; //巡過所有欄位,找出Score* foreach (DataGridColumn c in dg2.Columns) { if (c.Header.ToString().StartsWith("Score")) { //動態取得TextBlock物件 TextBlock tb = c.GetCellContent(o.Row) as TextBlock; //o.Row.DataContext就是SimData, 可以Hard-Coding去取sd.ScoreA/B //這裡則示範用Reflection法取Binding目標欄位值 PropertyInfo pi = sd.GetType().GetProperty( (c as DataGridTextColumn).Binding.Path.Path); decimal v = Convert.ToDecimal(pi.GetValue(sd, null)); tb.Foreground = (v >= 0) ? normal : negative; } } }; dg2.ItemsSource = data; #endregion dg3.ItemsSource = data; } //------------------- }//partial class MainPage public class SimData { public string SN { get; set; } public decimal ScoreA { get; set; } public decimal ScoreB { get; set; } } #region CellTemplate & ValueConverter //REF: http://bit.ly/dCFcBY public class ScoreColorConverter : IValueConverter { static SolidColorBrush NormalColor = new SolidColorBrush(Colors.Green); static SolidColorBrush NegColor = new SolidColorBrush(Colors.Red); //依數字正負採用不同顏色 public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { decimal score = System.Convert.ToDecimal(value); return score >= 0 ? NormalColor : NegColor; } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotSupportedException(); } } #endregion #region CustDataColumn public class ScoreColumn : DataGridTextColumn { static ScoreColorConverter scc = new ScoreColorConverter(); protected override FrameworkElement GenerateElement( DataGridCell cell, object dataItem) { //GenerateElement可以用來任意組裝要呈現的元素, 很有彈性 TextBlock tb = base.GenerateElement(cell, dataItem) as TextBlock; //此例用Binding.Converter的方法動態換色 //若不用Converter,用轉型或Refelection取出dataItem的值做判斷亦可 Binding b = new System.Windows.Data.Binding(this.Binding.Path.Path); b.Converter = scc; tb.SetBinding(TextBlock.ForegroundProperty, b); //示範在程式端設定Style tb.TextAlignment = TextAlignment.Center; return tb; } } #endregion }