C# Silverlight工具包;饼图颜色

C# Silverlight工具包;饼图颜色,c#,silverlight,silverlight-4.0,silverlight-toolkit,pie-chart,C#,Silverlight,Silverlight 4.0,Silverlight Toolkit,Pie Chart,我有一个巨大的问题,我无法解决。假设我有五种不同的水果,我希望它们中的每一种都有特定的颜色。假设我有三个“篮子”,其中包含零个或更多的水果 当我为我的三个篮子制作饼图时,每个楔子都是一些随机的颜色,可能是由控件选择的。我怎么说,让蓝莓变成蓝色,班纳纳斯变成黄色,等等 我知道这是一个奇怪的问题,但我想不出更简单的方式来描述它 我不在乎解决方案是用XAML还是用代码,只要它有效。您可以为图表定义自己的调色板,但它会自动选择调色板中显示的数据项的颜色。因此,没有(简单的?)方法告诉图表显示蓝莓蓝色、班

我有一个巨大的问题,我无法解决。假设我有五种不同的水果,我希望它们中的每一种都有特定的颜色。假设我有三个“篮子”,其中包含零个或更多的水果

当我为我的三个篮子制作饼图时,每个楔子都是一些随机的颜色,可能是由控件选择的。我怎么说,让蓝莓变成蓝色,班纳纳斯变成黄色,等等

我知道这是一个奇怪的问题,但我想不出更简单的方式来描述它


我不在乎解决方案是用XAML还是用代码,只要它有效。

您可以为图表定义自己的调色板,但它会自动选择调色板中显示的数据项的颜色。因此,没有(简单的?)方法告诉图表显示蓝莓蓝色、班纳纳斯黄色等。您可以做的是告诉图表显示第一项蓝色、第二项黄色等,并将蓝莓第一、班纳纳斯第二等放在数据源中

一些用于定义您自己的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 >

经过多次咒骂和调查,我找到了解决办法。这里有很多活动部分,所以我将尽可能简短地介绍每一部分,同时仍要传达要点

首先,我有一个我试图跟踪的对象集合:

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; }
    }
...
}
这就是你每次都能得到正确颜色的方法。如果我遗漏了什么或需要澄清,请让我知道,以便我可以进行更正。这里有很多活动部件=以下是我的发现: 颜色并不是随机的:有一系列的托盘,每5次重复一次(数量其实并不重要)。我的解决方法更简单:每次有新数据要显示时,我都会重新创建图表。这样,颜色托盘将始终从相同的颜色开始(意味着它永远不会改变)。这意味着您需要有一个通过编程重新构建PieChart的方法(在XAML中没有它,只需要有一个占位符并调用“PieChartBuilder”方法)。
我认为这是更少的代码(也更少的bug:)。

Re:namespace。只需使用xmlns:toolkit=“”使用所有这些不同的别名是非常困难的,因此我尝试了这种方法,但如果由于某种原因重新加载图表,颜色的顺序不会从#1开始,因为它们是以“循环方式”选择的。您仍然无法控制颜色。每次数据发生变化时仅仅制作一张新图表是一种愚蠢的做法。此外,如果有多个饼图,您的方法将再次失败。此外,如果图表中项目的顺序/数量不同。我可以继续说下去。
public class BasketVM
{
...
    private ObservableCollection<PileOfFruit> _FruitBasket = new ObservableCollection<PileOfFruit>();
    public ObservableCollection<PileOfFruit> FruitBasket
    {
      get { return _FruitBasket; }
    }
...
}
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;
        ......