Набор инструментов Silverlight;Цвета круговой диаграммы - PullRequest
4 голосов
/ 12 октября 2011

У меня огромная проблема, которую я не могу понять.Допустим, у меня есть пять разных фруктов, и я хочу, чтобы каждый из них был связан с определенным цветом.Допустим, у меня есть три «корзины», которые содержат ноль или более указанных фруктов.

Когда я делаю круговые диаграммы для моих трех корзин, каждый клин - это просто некоторый случайный цвет, который предположительно выбирается элементом управления.Как бы я сказал, чтобы голубики голубики, желтые бананы и т. Д. На графике?

Я знаю, что это странный вопрос, но я не могу придумать более простой способ его описания.

Мне все равно, будет ли решение в XAML или коде, если оно работает.

Ответы [ 3 ]

5 голосов
/ 13 октября 2011

Я нашел решение после долгих ругательств и расследований. Здесь много движущихся частей, поэтому я собираюсь держать каждую из них как можно более краткой, все же передавая основные моменты.

Для начала у меня есть коллекция объектов, которые я пытаюсь отследить:

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 Оно связано с независимым значением, которое будет чем-то вроде «банана», «винограда» или чего-то еще. Это в свою очередь передается преобразователю значений.

<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 голосов
/ 13 октября 2011

Вы можете определить свою собственную цветовую палитру для диаграммы, но она автоматически выберет цвета для элементов данных, как они появляются в палитре. Таким образом, нет (простой?) Способ указать диаграмме, чтобы она отображала голубики голубых, желтые бананы и т. Д. Что вы можете сделать, это сказать диаграмме, чтобы они отображали синий, первый, второй желтые элементы и т. Д., А во-первых помещать чернику, вторые - баннаны и т.д. . в источнике данных.

Пример для определения вашей собственной палитры:

<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"
0 голосов
/ 08 января 2012

Вот что я нашел: Цвета на самом деле не случайны: есть последовательность палитр, которая повторяется каждые 5 раз (число на самом деле не имеет значения). Мой обходной путь проще: каждый раз, когда у меня появляются новые данные, я воссоздаю круговую диаграмму. Таким образом, цветовая палитра всегда будет начинаться с одних и тех же цветов (это означает, что она никогда не изменится). Это означает, что вам нужен метод, который программно перестраивает ваш PieChart (не используйте его в XAML, просто добавьте заполнитель и вызовите метод PieChartBuilder). Я думаю, что это меньше кода (также меньше ошибок :)).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...