我有一个巨大的问题,我无法弄清楚。假设我有五种不同的水果,我希望他们每个人都与某种颜色相关联。假设我有三个包含零个或更多所述水果的“篮子”。Silverlight工具包;饼图颜色
当我为我的三个篮子制作饼图时,每个楔形只是一些随机的颜色,可以由控件挑选出来。我怎么说,在图表中将蓝莓变成蓝色,bannanas变成黄色等等?
我知道这是一个奇怪的问题,但我想不出一个更简单的方式来描述它。
我不在乎解决方案是否在XAML或代码中,只要它工作。
我有一个巨大的问题,我无法弄清楚。假设我有五种不同的水果,我希望他们每个人都与某种颜色相关联。假设我有三个包含零个或更多所述水果的“篮子”。Silverlight工具包;饼图颜色
当我为我的三个篮子制作饼图时,每个楔形只是一些随机的颜色,可以由控件挑选出来。我怎么说,在图表中将蓝莓变成蓝色,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对象拖放其他一些地方结合现在。密切关注的价值填充它必然会是像“香蕉”'葡萄'之类的独立价值。这反过来又传递给一个值转换器。
<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第二等在数据源中。
一些样品来定义自己的帕莱塔:
<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"
这里是我发现的: 颜色并不是真正的随机:有一个托盘序列每5次重复一次(实际上这个数字没有“问题)。我的解决方法更简单:每当我有新的数据显示时,我都会重新创建饼图。通过这种方式,彩色调色板将始终从相同的颜色开始(这意味着它永远不会改变)。这意味着你需要一个编程式重建你的PieChart的方法(在XAML中没有它,只需要有一个占位符并调用“PieChartBuilder”方法)。 我认为这是更少的代码(也更少的bug :))。
您仍然无法控制颜色。每当数据发生变化时就制作一张新图表是一件愚蠢的事情。另外,如果有多个饼图,则您的方法将再次失败。另外,如果图表中项目的顺序/数量不同。我可以继续下去。 –
回复:命名空间。只是使用xmlns:toolkit =“http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit”具有所有这些不同的别名是如此SL3 – AnthonyWJones
我试过这种方法,但如果图表重新加载某种原因,颜色的顺序不是从#1开始的,因为它们是以“循环方式”选择的。 –