#c# #silverlight #silverlight-4.0 #silverlight-toolkit #pie-chart
#c# #silverlight #silverlight-4.0 #silverlight-toolkit #круговая диаграмма
Вопрос:
У меня огромная проблема, которую я не могу решить. Допустим, у меня есть пять разных фруктов, и я хочу, чтобы каждый из них был связан с определенным цветом. Допустим, у меня есть три «корзины», которые содержат ноль или более указанных фруктов.
Когда я создаю круговые диаграммы для своих трех корзин, каждый клин представляет собой просто некоторый случайный цвет, который предположительно выбирается элементом управления. Как бы я сказал, сделать голубику синей, бананы желтыми и т.д. На диаграмме?
Я знаю, что это странный вопрос, но я не могу придумать более простого способа его описания.
Мне все равно, находится ли решение в XAML или в коде, главное, чтобы оно работало.
Ответ №1:
Я нашел решение после долгих ругательств и исследований. Здесь много движущихся частей, поэтому я собираюсь изложить каждую из них как можно короче, сохраняя при этом основные моменты.
Для начала у меня есть коллекция объектов, которые я пытаюсь отслеживать:
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 Defau< }
switch (value as string)
{
case "Apple":
return new SolidColorBrush(Colors.Red);
case "BlueBerry":
return new SolidColorBrush(Colors.Blue);
default:
return Defau<
......
И именно так вы получаете правильные цвета каждый раз. Если я что-то упустил или должен уточнить, пожалуйста, дайте мне знать, чтобы я мог внести исправления. Здесь много движущихся частей .. =P
Ответ №2:
Вы можете определить свою собственную цветовую палитру для диаграммы, но она автоматически выберет цвета для элементов данных по мере их отображения в палитре. Таким образом, нет (простого?) способа указать диаграмме, чтобы черника отображалась синей, бананы — желтой и т.д. Что вы можете сделать, так это указать диаграмме отображать первый элемент синим, второй элемент желтым и т.д. и поместить blueberries первым, 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 >
РЕДАКТИРОВАТЬ: интересные названия:
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"
Комментарии:
1. Re: Пространства имен. Просто используйте xmlns:toolkit=» schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit » наличие всех этих разных псевдонимов настолько SL3
2. Я пробовал этот подход, но если диаграмма по какой-либо причине перезагружается, порядок цветов не начинается с # 1, поскольку они выбираются «циклическим способом».
Ответ №3:
Вот что я нашел: Цвета на самом деле не случайны: существует последовательность палитр, которая повторяется каждые 5 раз (количество на самом деле не имеет значения). Мой обходной путь проще: каждый раз, когда у меня появляются новые данные для отображения, я воссоздаю точечную диаграмму. Таким образом, палитра цветов всегда будет начинаться с одних и тех же цветов (что означает, что она никогда не изменится). Это означает, что вам нужно иметь метод, который программно перестраивает вашу диаграмму элементов (не используйте его в XAML, просто используйте заполнитель и вызовите метод PieChartBuilder). Я думаю, что это меньше кода (также меньше ошибок 🙂 ).
Комментарии:
1. У вас все еще нет контроля над цветами. Просто создавать новую диаграмму каждый раз при изменении данных — глупый взлом. Кроме того, если имеется более одной круговой диаграммы, ваш метод снова завершится неудачей. Кроме того, если порядок / количество элементов в диаграммах различны. Я мог бы продолжать и продолжать.