Как сбросить цветовую палитру WPF Toolkit Chart при сбросе данных - PullRequest
3 голосов
/ 20 декабря 2011

У меня есть круговая диаграмма в пользовательском элементе управления WPF, данные которого периодически изменяются, однако я не создаю каждый раз новый элемент управления диаграммы, просто очищаю данные в ItemsSource и затем вставляю новые значения.

КаждыйКогда значения обновляются, цветовая гамма продолжает проходить через выбранные цвета.

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

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

Ответы [ 2 ]

4 голосов
/ 10 января 2012

У меня та же проблема, и я нашел другое решение.Возможно, это не лучший вариант, но он работает.

Я добавил свойство int к привязке моего объекта в PieSeries, которые представляют индекс элемента в ObservableCollection.Затем я создал ResourceDictionaryCollection, который содержит все цвета по умолчанию для Палитры:

<datavis:ResourceDictionaryCollection x:Key="CouleursGraphique">
    <!-- Blue -->
    <ResourceDictionary>
      <RadialGradientBrush x:Key="Background" GradientOrigin="-0.1,-0.1" Center="0.075,0.015" RadiusX="1.05" RadiusY="0.9">
        <GradientStop Color="#FFB9D6F7" />
        <GradientStop Color="#FF284B70" Offset="1" />
      </RadialGradientBrush>
    </ResourceDictionary>
    <!-- Red -->
    <ResourceDictionary>
      <RadialGradientBrush x:Key="Background" GradientOrigin="-0.1,-0.1" Center="0.075,0.015" RadiusX="1.05" RadiusY="0.9">
        <GradientStop Color="#FFFBB7B5" />
        <GradientStop Color="#FF702828" Offset="1" />
      </RadialGradientBrush>
    </ResourceDictionary>
    <!-- Light Green -->
    <ResourceDictionary>
      <RadialGradientBrush x:Key="Background" GradientOrigin="-0.1,-0.1" Center="0.075,0.015" RadiusX="1.05" RadiusY="0.9">
        <GradientStop Color="#FFB8C0AC" />
        <GradientStop Color="#FF5F7143" Offset="1" />
      </RadialGradientBrush>
    </ResourceDictionary>
    <!-- Yellow -->
    <ResourceDictionary>
      <RadialGradientBrush x:Key="Background" GradientOrigin="-0.1,-0.1" Center="0.075,0.015" RadiusX="1.05" RadiusY="0.9">
        <GradientStop Color="#FFFDE79C" />
        <GradientStop Color="#FFF6BC0C" Offset="1" />
      </RadialGradientBrush>
    </ResourceDictionary>
    <!-- Indigo -->
    <ResourceDictionary>
      <RadialGradientBrush x:Key="Background" GradientOrigin="-0.1,-0.1" Center="0.075,0.015" RadiusX="1.05" RadiusY="0.9">
        <GradientStop Color="#FFA9A3BD" />
        <GradientStop Color="#FF382C6C" Offset="1" />
      </RadialGradientBrush>
    </ResourceDictionary>
    <!-- Magenta -->
    <ResourceDictionary>
      <RadialGradientBrush x:Key="Background" GradientOrigin="-0.1,-0.1" Center="0.075,0.015" RadiusX="1.05" RadiusY="0.9">
        <GradientStop Color="#FFB1A1B1" />
        <GradientStop Color="#FF50224F" Offset="1" />
      </RadialGradientBrush>
    </ResourceDictionary>
    <!-- Dark Green -->
    <ResourceDictionary>
      <RadialGradientBrush x:Key="Background" GradientOrigin="-0.1,-0.1" Center="0.075,0.015" RadiusX="1.05" RadiusY="0.9">
        <GradientStop Color="#FF9DC2B3" />
        <GradientStop Color="#FF1D7554" Offset="1" />
      </RadialGradientBrush>
    </ResourceDictionary>
    <!-- Gray Shade -->
    <ResourceDictionary>
      <RadialGradientBrush x:Key="Background" GradientOrigin="-0.1,-0.1" Center="0.075,0.015" RadiusX="1.05" RadiusY="0.9">
        <GradientStop Color="#FFB5B5B5" />
        <GradientStop Color="#FF4C4C4C" Offset="1" />
      </RadialGradientBrush>
    </ResourceDictionary>
    <!-- Blue -->
    <ResourceDictionary>
      <RadialGradientBrush x:Key="Background" GradientOrigin="-0.1,-0.1" Center="0.075,0.015" RadiusX="1.05" RadiusY="0.9">
        <GradientStop Color="#FF98C1DC" />
        <GradientStop Color="#FF0271AE" Offset="1" />
      </RadialGradientBrush>
    </ResourceDictionary>
    <!-- Brown -->
    <ResourceDictionary>
      <RadialGradientBrush x:Key="Background" GradientOrigin="-0.1,-0.1" Center="0.075,0.015" RadiusX="1.05" RadiusY="0.9">
        <GradientStop Color="#FFC1C0AE" />
        <GradientStop Color="#FF706E41" Offset="1" />
      </RadialGradientBrush>
    </ResourceDictionary>
    <!-- Cyan -->
    <ResourceDictionary>
      <RadialGradientBrush x:Key="Background" GradientOrigin="-0.1,-0.1" Center="0.075,0.015" RadiusX="1.05" RadiusY="0.9">
        <GradientStop Color="#FFADBDC0" />
        <GradientStop Color="#FF446A73" Offset="1" />
      </RadialGradientBrush>
    </ResourceDictionary>
    <!-- Special Blue -->
    <ResourceDictionary>
      <RadialGradientBrush x:Key="Background" GradientOrigin="-0.1,-0.1" Center="0.075,0.015" RadiusX="1.05" RadiusY="0.9">
        <GradientStop Color="#FF2F8CE2" />
        <GradientStop Color="#FF0C3E69" Offset="1" />
      </RadialGradientBrush>
    </ResourceDictionary>
    <!-- Gray Shade 2 -->
    <ResourceDictionary>
      <RadialGradientBrush x:Key="Background" GradientOrigin="-0.1,-0.1" Center="0.075,0.015" RadiusX="1.05" RadiusY="0.9">
        <GradientStop Color="#FFDCDCDC" />
        <GradientStop Color="#FF757575" Offset="1" />
      </RadialGradientBrush>
    </ResourceDictionary>
    <!-- Gray Shade 3 -->
    <ResourceDictionary>
      <RadialGradientBrush x:Key="Background" GradientOrigin="-0.1,-0.1" Center="0.075,0.015" RadiusX="1.05" RadiusY="0.9">
        <GradientStop Color="#FFF4F4F4" />
        <GradientStop Color="#FFB7B7B7" Offset="1" />
      </RadialGradientBrush>
    </ResourceDictionary>
    <!-- Gray Shade 4 -->
    <ResourceDictionary>
      <RadialGradientBrush x:Key="Background" GradientOrigin="-0.1,-0.1" Center="0.075,0.015" RadiusX="1.05" RadiusY="0.9">
        <GradientStop Color="#FFF4F4F4" />
        <GradientStop Color="#FFA3A3A3" Offset="1" />
      </RadialGradientBrush>
    </ResourceDictionary>
  </datavis:ResourceDictionaryCollection>

Я добавил конвертер, который возвращает цвет по указанному индексу ResourceDictionaryCollection.

 /// <summary>
    /// Convertit une valeur.
    /// </summary>
    /// <param name="value">Valeur produite par la source de liaison.</param>
    /// <param name="targetType">Type de la propriété de cible de liaison.</param>
    /// <param name="parameter">Paramètre de convertisseur à utiliser.</param>
    /// <param name="culture">Culture à utiliser dans le convertisseur.</param>
    /// <returns>
    /// Une valeur convertie. Si la méthode retourne null, la valeur Null valide est utilisée.
    /// </returns>
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        ResourceDictionaryCollection listeCouleurs = parameter as ResourceDictionaryCollection;
        int indice = (int)value;

        return listeCouleurs[indice % listeCouleurs.Count]["Background"];
    }

И яиспользовал все эти элементы в Xaml следующим образом:

  <charting:Chart.Series>
<charting:PieSeries ItemsSource="{Binding Path=Donnees}"
                    DependentValuePath="Valeur"
                    IndependentValuePath="Libelle">
  <charting:PieSeries.Palette>
    <datavis:ResourceDictionaryCollection>
      <ResourceDictionary>
        <Style x:Key="DataPointStyle" TargetType="Control">
          <Setter Property="Background" Value="{Binding Path=Index, Converter={StaticResource convCouleur}, ConverterParameter={StaticResource CouleursGraphique}}"/>
        </Style>
      </ResourceDictionary>
    </datavis:ResourceDictionaryCollection>
  </charting:PieSeries.Palette>
</charting:PieSeries>

Я надеюсь, что ответ поможет вам.

1 голос
/ 19 февраля 2013

Если вы не хотите добавлять другое свойство к вашим данным и конвертер, вы можете использовать отражение.

Чтобы упростить представление данных, ряд данных wpftoolkit имеет наследуемую ResourceDictionaryDispenser, отвечающую запредоставляя разный набор словарей ресурсов каждый раз, когда он вызывается.ResourceDictionaryDispenser в каждом DataPointSeries получает свои собственные перечислители от объекта в Chart.

Жаль, что свойство ResourceDictionaryDispenser в Chart является приватным, как и его метод Reset(),Однако вы можете использовать следующий код:

Type t = typeof(Chart);

PropertyInfo fResDispenser = t.GetProperty("ResourceDictionaryDispenser",
    BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.GetProperty);

resDispenser = fResDispenser.GetValue(chart, null);

ResDispenserReset = resDispenser.GetType().GetMethod("Reset",
    BindingFlags.NonPublic | BindingFlags.Instance);

ResDispenserReset.Invoke(resDispenser, null);

После сохранения ссылки на метод и распределитель ресурсов следует избегать прямой привязки вашего источника данных к серии 'ItemsSource.Вместо этого перехватите обновление ваших данных (возможно, с событием INotifyPropertyChanged.PropertyChanged) и действуйте так:

pieDataSeries.ItemsSource = null;
ResDispenserReset.Invoke(resDispenser, null);
pieDataSeries.ItemsSource = [new data set];

протестирован и работает на 100%.

XAML выглядит следующим образом:

<UserControl x:Class="Datamanager.Widgets.SubunitsPieChart"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:gra="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit">
    <gra:Chart Margin="5"
               x:Name="chart"
               HorizontalAlignment="Stretch"
               VerticalAlignment="Stretch"
               BorderThickness="0">
        <gra:PieSeries x:Name="chartSeries"
                       DependentValuePath="Value"
                       IndependentValuePath="Key" />
    </gra:Chart>
</UserControl>

Вы должны добавить эти using s тоже.

using System.Reflection;
using System.Windows.Controls.DataVisualization;
using System.Windows.Controls.DataVisualization.Charting;
...