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