文章分類/

Infragistics|Ultimate UI for WPF|根據 XamDataChart 中的值創建一系列具有不同顏色的項目

144 瀏覽人次
2023-09-03 更新

infragistics log

Infragistics XamDataChart 針對 Silverlight 和 WPF,允許您創建系列,其中標記根據綁定項目的屬性看起來不同。

您可以在 MarkerSeries(例如 ScatterSeries 和 RangeColumnSeries)上使用 MarkerTemplate 屬性。您可以創建自定義 DataTemplate,其中 UI 元素的屬性綁定到項目的 DataContext 屬性。

<DataTemplate x:Key="bubbleTemplate" >      <Ellipse Stretch="Fill"                 HorizontalAlignment="Stretch"                 VerticalAlignment="Stretch"                 StrokeThickness="0.5"                 MinWidth="10" MinHeight="10"                 Width="{Binding Item.Width}"                 Height="{Binding Item.Width}">          <ToolTipService.ToolTip>              <StackPanel Orientation="Vertical">                  <TextBlock Text="{Binding Item.YValue, StringFormat='Value: {0}'}" />              </StackPanel>          </ToolTipService.ToolTip>      </Ellipse>  </DataTemplate>

RgbValueConverter 將數值轉換為具有連續調色板的 SolidColorBrush。

您可能希望根據項目的 DataContext 的值更改標記的顏色。值可以有不同的類型。需要 ValueConverter 將指定類型的值轉換為特定顏色的 Brush。

本文介紹兩種類型的轉換器,用於將數字類型轉換為離散調色板和將數字類型轉換為連續調色板。

該示例應用程序以 Silverlight 為目標。XamDataChart for WPF 允許您以相同的方式創建 WPF 應用程序。

創建示例應用程序的要求:

軟件:

  1. visual studio 2010
  2. 用於 Silverlight 數據可視化的 NetAdvantage 的 Infragistics XamMap 組件(此示例是 2010.2 版本)

創建步驟:

對於Silverlight:

  1. 創建 Silverlight 應用程序。
  2. 創建一個值轉換器。NumberToBrush 將數字轉換為具有單獨調色板的畫筆。RgbValueConverter 將數字轉換為具有連續調色板的畫筆。大多數組件使用 Brush 來實現背景、描邊等屬性。
  3. 創建要在 XamDataChart 的 DataContext 中使用的示例數據。
  4. 創建一個代表圓的 MarkerTemplate。顏色綁定到 YValue 屬性。我們將在這裡使用兩個轉換器。
  5. 使用您創建的 MarkerTemplate 定義為散點圖系列創建 XamDataChart。
  6. 運行示例應用程序。

1. 在 Visual Studio 2010 中創建 Silverlight 應用程序。

2. 添加兩個ValueConverter。

NumberToBrush 將數字(雙精度類型)轉換為 SolidColorBrush。畫筆是從單獨的調色板中獲取的顏色。調色板中有 6 個 SolidColorBrush。顏色有白、紅、橙、黃、綠、藍。由於它是一個參數,因此它有一個範圍,轉換器返回一個相對於該數字的 SolidColorBrush。如果值超出範圍,則返回白色 SolidColorBrush。

public sealed class NumberToBrush : IValueConverter  {         private Brush[] _brushes = new Brush[] { new SolidColorBrush(Colors.White),                                              new SolidColorBrush(Colors.Red),                                              new SolidColorBrush(Colors.Orange),                                              new SolidColorBrush(Colors.Yellow),                                              new SolidColorBrush(Colors.Green),                                              new SolidColorBrush(Colors.Blue)};         #region Property Accessors         public Brush[] Brushes      {          get { return this._brushes; }          set { this._brushes = value; }      }         #endregion         #region IValueConverter         public object Convert(object value, Type targetType, object parameter,          System.Globalization.CultureInfo culture)      {             if ((typeof(Brush) != targetType || typeof(double) != value.GetType()))          {              return null;          }             Range range = parameter as Range;          if(range == null)          {              range = new Range();              range.Min = 0;              range.Max = 10;          }             var i = (double)value;             double interval = (double)(range.Max - range.Min)/(_brushes.Length - 1);          int index = (int)(i / interval + 0.5);             if (index <= 0 || index >= this._brushes.Length) return this._brushes[0];             return this._brushes[index];      }         public object ConvertBack(object value, Type targetType, object parameter,          System.Globalization.CultureInfo culture)      {          throw new NotImplementedException();      }         #endregion  }     public class Range : BaseViewModel  {      #region Min         private int _min;      public int Min      {          get { return this._min; }          set          {              this._min = value;              OnPropertyChanged("Min");          }      }         #endregion // Min         #region Max         private int _max;      public int Max      {          get { return this._max; }          set          {              this._max = value;              OnPropertyChanged("Max");          }      }         #endregion // Max     }

該轉換器使用 HSV(色相-飽和度-值)。

http://ja.wikipedia.org/wiki/HSV%E8%89%B2%E7%A9%BA%E9%96%93

請參閱維基百科鏈接以獲取更多信息。

RgbValueConverter 對最小值和最大值內的數字進行標準化。

varnormValue = i * 360/(範圍.Max – 範圍.Min);

RgbValueConverter 的代碼如下。

public sealed class RgbValueConverter : IValueConverter  {         private static Color ColorFromHsv(double hue, double saturation, double value)      {          int hi = (int)(Math.Floor(hue / 60)) % 6;          double f = hue / 60 - Math.Floor(hue / 60);             value = value * 255;          int v = (int)(value);          int p = (int)(value * (1 - saturation));          int q = (int)(value * (1 - f * saturation));          int t = (int)(value * (1 - (1 - f) * saturation));             if (hi == 0)          {              return Color.FromArgb(255, (byte)v, (byte)t, (byte)p);          }             if (hi == 1)          {              return Color.FromArgb(255, (byte)q, (byte)v, (byte)p);          }             if (hi == 2)          {              return Color.FromArgb(255, (byte)p, (byte)v, (byte)t);          }             if (hi == 3)          {              return Color.FromArgb(255, (byte)p, (byte)q, (byte)v);          }             if (hi == 4)          {              return Color.FromArgb(255, (byte)t, (byte)p, (byte)v);          }             return Color.FromArgb(255, (byte)v, (byte)p, (byte)q);      }            #region IValueConverter         public object Convert(object value, Type targetType, object parameter,          System.Globalization.CultureInfo culture)      {             if ((typeof(Brush) != targetType || typeof(double) != value.GetType()))          {              return null;          }             Range range = parameter as Range;          if(range == null)          {              range = new Range();              range.Min = 0;              range.Max = 10;          }             var i = System.Convert.ToDouble(value);             if (i <= range.Min || range.Min >= range.Max)          {                             return new SolidColorBrush(Colors.White);          }             var normValue = i * 360/(range.Max - range.Min);             return new SolidColorBrush(ColorFromHsv(normValue, 1, 1));         }         public object ConvertBack(object value, Type targetType, object parameter,          System.Globalization.CultureInfo culture)      {          throw new NotImplementedException();      }         #endregion     } 

3. 創建要在 XamDataChart 的 DataContext 中使用的示例數據。

public class BubbleDataCollection          : ObservableCollection  {         public BubbleDataCollection()      {          this.Add(new BubblePoint { XValue = 4, YValue = 10, Width = 30 });          this.Add(new BubblePoint { XValue = 4, YValue = 4, Width = 40 });          this.Add(new BubblePoint { XValue = 8, YValue = 8, Width = 20 });          this.Add(new BubblePoint { XValue = 10, YValue = 1, Width = 50 });          this.Add(new BubblePoint { XValue = 1, YValue = 10, Width = 40 });      }     }     public class BubblePoint  {      public double XValue { get; set; }      public double YValue { get; set; }      public double Width { get; set; }  } 
    <UserControl.Resources>          ...          <XamDataChartCustomTemplatesDemo:BubbleDataCollection x:Key="bubbleCollection" />         ....      <Grid x:Name="LayoutRoot" Background="White" DataContext="{StaticResource bubbleCollection}">

4. 創建一個代表圓的MarkerTemplate。顏色綁定到 YValue 屬性。我們將在這裡使用兩個轉換器。

<UserControl.Resources>      <Converters:NumberToBrush x:Key="indexToBrush"/>      <Converters:RgbValueConverter x:Key="RgbToBrush"/>      <XamDataChartCustomTemplatesDemo:BubbleDataCollection x:Key="bubbleCollection" />      <Converters:Range x:Key="range" Min="0" Max="10"/>      <DataTemplate x:Key="bubbleTemplate" >          <Ellipse Stretch="Fill"                     HorizontalAlignment="Stretch"                     VerticalAlignment="Stretch"                     Fill="{Binding Item.YValue, Converter={StaticResource indexToBrush}, ConverterParameter={StaticResource range}}"                     Stroke="{Binding Series.ActualMarkerOutline}"                     StrokeThickness="0.5"                     MinWidth="10" MinHeight="10"                     Width="{Binding Item.Width}"                     Height="{Binding Item.Width}">              <ToolTipService.ToolTip>                  <StackPanel Orientation="Vertical">                      <TextBlock Text="{Binding Item.YValue, StringFormat='Value: {0}'}" />                  </StackPanel>              </ToolTipService.ToolTip>          </Ellipse>      </DataTemplate>      <DataTemplate x:Key="bubbleTemplate2" >          <Ellipse Stretch="Fill"                     HorizontalAlignment="Stretch"                     VerticalAlignment="Stretch"                     Fill="{Binding Item.YValue, Converter={StaticResource RgbToBrush}, ConverterParameter={StaticResource range}}"                     Stroke="{Binding Series.ActualMarkerOutline}"                     StrokeThickness="0.5"                     MinWidth="10" MinHeight="10"                     Width="{Binding Item.Width}"                     Height="{Binding Item.Width}">              <ToolTipService.ToolTip>                  <StackPanel Orientation="Vertical">                      <TextBlock Text="{Binding Item.YValue, StringFormat='Value: {0}'}" />                  </StackPanel>              </ToolTipService.ToolTip>          </Ellipse>      </DataTemplate>         </UserControl.Resources>

MarkerTemplate 定義包含一個橢圓,該橢圓由基於 BubblePoint 對象的 YValue 的 Brush 填充。

5. 使用您創建的 MarkerTemplate 定義創建散點圖系列 XamDataChart。

<igChart:XamDataChart x:Name="theChart">      <igChart:XamDataChart.Axes>          <igChart:NumericXAxis x:Name="xAxis"                                 MinimumValue="0" MaximumValue="15"/>          <igChart:NumericYAxis x:Name="yAxis"                                 MinimumValue="0" MaximumValue="15"/>      </igChart:XamDataChart.Axes>         <igChart:XamDataChart.Series>          <igChart:ScatterSeries x:Name="scatter"                                 MarkerTemplate="{StaticResource bubbleTemplate}"                                 ItemsSource="{Binding}"                                 XMemberPath="XValue"                                 YMemberPath="YValue"                                 XAxis="{Binding ElementName=xAxis}"                                 YAxis="{Binding ElementName=yAxis}"></igChart:ScatterSeries>      </igChart:XamDataChart.Series>  </igChart:XamDataChart>  ...  <igChart:XamDataChart x:Name="theChart2">      <igChart:XamDataChart.Axes>          <igChart:NumericXAxis x:Name="xAxis2"                                     MinimumValue="0" MaximumValue="15"/>          <igChart:NumericYAxis x:Name="yAxis2"                                     MinimumValue="0" MaximumValue="15"/>      </igChart:XamDataChart.Axes>         <igChart:XamDataChart.Series>          <igChart:ScatterSeries x:Name="scatter2"                                     MarkerTemplate="{StaticResource bubbleTemplate2}"                                     ItemsSource="{Binding}"                                     XMemberPath="XValue"                                     YMemberPath="YValue"                                     XAxis="{Binding ElementName=xAxis2}"                                     YAxis="{Binding ElementName=yAxis2}"></igChart:ScatterSeries>      </igChart:XamDataChart.Series>     </igChart:XamDataChart>

6. 運行應用程序。

快速跳轉目錄

✦ 群昱 AccessSoft 你的全面軟體解決方案 ✦

身為全球眾多知名軟體在台灣合作夥伴,歡迎諮詢你需要的軟體服務!

Picture of 軟體專家
軟體專家

群昱作為全球知名軟體推薦合作夥伴,致力於提供更多軟體解決方案給你!

更多軟體新知

立即詢價

請留下完整資訊,以便我們提供精確的服務內容給你。

詢價資訊