4

我有一個巨大的問題,我無法弄清楚。假設我有五種不同的水果,我希望他們每個人都與某種顏色相關聯。假設我有三個包含零個或更多所述水果的「籃子」。Silverlight工具包;餅圖顏色

當我爲我的三個籃子製作餅圖時,每個楔形只是一些隨機的顏色,可以由控件挑選出來。我怎麼說,在圖表中將藍莓變成藍色,bannanas變成黃色等等?

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

我不在乎解決方案是否在XAML或代碼中,只要它工作。

回答

5

我已經找到了解決辦法,很多髒話和調查後。這裏有很多移動部件,所以我將盡可能簡短地說明各個要點,同時還要說明要點。

對於初學者我有我試圖保持跟蹤對象的集合:

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對象拖放其他一些地方結合現在。密切關注的價值填充它必然會是像「香蕉」'葡萄'之類的獨立價值。這反過來又傳遞給一個值轉換器。

<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

3

您可以爲圖表定義自己的調色板,但它會自動爲數據項選擇顏色,因爲它們出現在調色板中。因此,沒有(簡單的)方式告訴圖表顯示藍莓藍色,bannanas黃色等。您可以做的是告訴圖表顯示第一個項目藍色,第二個項目黃色等,並且首先將藍莓,bannanas第二等在數據源中。

一些樣品來定義自己的帕萊塔:

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

編輯:有趣的namespeces:

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" 
+0

回覆:命名空間。只是使用xmlns:toolkit =「http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit」具有所有這些不同的別名是如此SL3 – AnthonyWJones

+1

我試過這種方法,但如果圖表重新加載某種原因,顏色的順序不是從#1開始的,因爲它們是以「循環方式」選擇的。 –

-1

這裏是我發現的: 顏色並不是真正的隨機:有一個托盤序列每5次重複一次(實際上這個數字沒有「問題)。我的解決方法更簡單:每當我有新的數據顯示時,我都會重新創建餅圖。通過這種方式,彩色調色板將始終從相同的顏色開始(這意味着它永遠不會改變)。這意味着你需要一個編程式重建你的PieChart的方法(在XAML中沒有它,只需要有一個佔位符並調用「PieChartBuilder」方法)。 我認爲這是更少的代碼(也更少的bug :))。

+1

您仍然無法控制顏色。每當數據發生變化時就製作一張新圖表是一件愚蠢的事情。另外,如果有多個餅圖,則您的方法將再次失敗。另外,如果圖表中項目的順序/數量不同。我可以繼續下去。 –