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

您仍然无法控制颜色。每当数据发生变化时就制作一张新图表是一件愚蠢的事情。另外,如果有多个饼图,则您的方法将再次失败。另外,如果图表中项目的顺序/数量不同。我可以继续下去。 –