簡體   English   中英

Silverlight工具包;餅圖顏色

[英]Silverlight Toolkit ; Pie Chart Colors

我有一個我無法弄清楚的巨大問題。 假設我有五種不同的水果,我希望它們中的每一種都與某種顏色相關聯。 假設我有三個“籃子”,其中包含零個或多個所述水果。

當我為我的三個籃子制作餅圖時,每個楔子只是一些隨機顏色,可由控件選擇。 我怎么說,在圖表中做藍莓藍,bannanas黃色等?

我知道這是一個奇怪的問題,但我想不出更簡單的描述方式。

我不在乎解決方案是在XAML還是代碼中,只要它有效。

經過多次咒罵和調查后,我找到了解決方案。 這里有很多活動部件,所以我將盡可能簡短地保持每個部分,同時仍然傳達要點。

對於初學者,我有一組我想要跟蹤的對象:

public class PileOfFruit
{
  public string Name {get; set; }
  public int Count { get; set; }
}

在我的視圖模型中,我有一組這些對象。

public class BasketVM
{
...
    private ObservableCollection<PileOfFruit> _FruitBasket = new ObservableCollection<PileOfFruit>();
    public ObservableCollection<PileOfFruit> FruitBasket
    {
      get { return _FruitBasket; }
    }
...
}

在我看來,我將定義餅圖,它將顯示籃子中水果的數量。 這里最重要的因素是模板綁定到SliceTemplate

<chartingToolkit:Chart x:Name="ExampleChart">
    <chartingToolkit:PieSeries ItemsSource={Binding FruitBasket
                               DependentValueBinding="{Binding Count}" 
                               IndependentValueBinding="{Binding Name}">
        <chartingToolkit:PieSeries.Palette>
            <visualizationToolkit:ResourceDictionaryCollection>
            <ResourceDictionary>
                <Style x:Key="DataPointStyle" TargetType="Control">
                    <Setter Property="Template" Value="{StaticResource SliceTemplate}"/>
                </Style>

現在在app.xaml或其他地方我們可以放入PieDataSeries對象的模板。 密切注意Fill上的值它與獨立值綁定,這將類似於'banana''grape'或其他任何東西。 這反過來又傳遞給值轉換器。

<converters:FruitToColorConverter x:Key="FruitToColorConverter"/>

<ControlTemplate x:Key="SliceTemplate" TargetType="chart:PieDataPoint">
  <Path Data="{TemplateBinding Geometry}"
        Fill="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IndependentValue, Converter={StaticResource FruitToColorConverter}}"
        Stroke="{TemplateBinding BorderBrush}">
    ....

關聯的數據轉換器將最終設置我們想要的顏色。 所以,如果我們做這樣的事......

public class FruitToColorConverter : IValueConverter
{
  private SolidColorBrush Default = new SolidColorBrush(Colors.Black);

  public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
  {
    if (value == null || (!(value is string))) { return Default; }

    switch (value as string)
    {
      case "Apple":
        return new SolidColorBrush(Colors.Red);
      case "BlueBerry":
        return new SolidColorBrush(Colors.Blue);
      default:
        return Default;
        ......

這就是你每次都得到正確顏色的方法。 如果我遺漏了任何內容或應該澄清,請告訴我,以便我可以進行更正。 這里有很多活動部件.. = P.

您可以為圖表定義自己的調色板,但它會自動選擇調色板中顯示的數據項的顏色。 所以沒有(簡單?)方式告訴圖表顯示藍莓藍,bannanas黃色等。你可以做的是告訴圖表顯示第一項藍色,第二項黃色等,並先把藍莓,bannanas第二等。在數據源中。

一些樣本來定義您自己的paletta:

<chartingToolkit:Chart x:Name="ExampleChart">
    <chartingToolkit:PieSeries>
        <chartingToolkit:PieSeries.ItemsSource >
            <toolkit:ObjectCollection>
                <sys:Double>1</sys:Double>
                <sys:Double>2.3</sys:Double>
                <sys:Double>3.5</sys:Double>
                <sys:Double>5</sys:Double>
            </toolkit:ObjectCollection>
        </chartingToolkit:PieSeries.ItemsSource >
        <chartingToolkit:PieSeries.Palette>
            <visualizationToolkit:ResourceDictionaryCollection>
            <ResourceDictionary>
                <Style x:Key="DataPointStyle" TargetType="Control">
                    <Setter Property="Background" Value="Red"/>
                </Style>
            </ResourceDictionary>
            <ResourceDictionary>
                <Style x:Key="DataPointStyle" TargetType="Control">
                    <Setter Property="Background" Value="Green"/>
                </Style>
            </ResourceDictionary>
            <ResourceDictionary>
                <Style x:Key="DataPointStyle" TargetType="Control">
                    <Setter Property="Background" Value="Blue"/>
                </Style>
            </ResourceDictionary>
            </visualizationToolkit:ResourceDictionaryCollection>
        </chartingToolkit:PieSeries.Palette>
    </chartingToolkit:PieSeries >
</chartingToolkit:Chart >

編輯:有趣的名字:

xmlns:visualizationToolkit="clr-namespace:System.Windows.Controls.DataVisualization;assembly=System.Windows.Controls.DataVisualization.Toolkit" 
xmlns:chartingToolkit="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit"

以下是我發現的:顏色並不是隨機的:有一個托盤的順序,每5次重復一次(數量實際上並不重要)。 我的解決方法更簡單:每次我要顯示新數據時,我都會重新創建餅圖。 通過這種方式,顏色調色板將始終從相同的顏色開始(意味着它永遠不會改變)。 這意味着您需要一個以編程方式重建PieChart的方法(在XAML中沒有它,只需要一個占位符並調用“PieChartBuilder”方法)。 我認為這是更少的代碼(也更少的錯誤:​​))。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM