Легенда диаграммы Silverlight: серия мимических пирогов с серией столбцов - PullRequest
1 голос
/ 20 ноября 2011

У меня есть диаграмма Silverlight4 с одной серией столбцов.Вместо легенды, отображающей «Серию 1», я хотел бы, чтобы легенда содержала одну запись на столбец.В частности, я бы хотел, чтобы легенда отображала зависимое значение столбца.Круговая диаграмма делает именно это, и это именно то, что я хочу.Я попытался вручную установить свойство Items легенды, но оно доступно только для чтения.Я предполагаю, что написание собственного LegendStyle - лучший способ сделать это, но я относительно новичок в XAML, поэтому, если есть какие-либо эксперты по стилю, которые могут сделать это легко, я буду вечно благодарен.

Ответы [ 2 ]

2 голосов
/ 20 ноября 2011

ОК, вот как я это решил.Во-первых, вот мой простой класс:

public class Student
{
    public string Name { get; set; }
    public int Age { get; set; }
    public Brush FavoriteColor { get; set; }
}

Затем стиль, который окрашивает столбцы, взят из блога Дэвида Ансона здесь: http://blogs.msdn.com/b/delay/archive/2009/02/04/columns-of-a-different-color-customizing-the-appearance-of-silverlight-charts-with-re-templating-and-mvvm.aspx

Используя в качестве примера код легенды Дэвида Пирог серииВ конце концов я создал этот стиль для самой легенды:

    <Style x:Key="ColorByPreferenceLegend"  TargetType="toolkit:Legend">
        <Setter Property="Margin" Value="15,25" />
        <Setter Property="VerticalAlignment" Value="Center" />
        <Setter Property="BorderBrush" Value="#FFDBDBDB" />
        <Setter Property="Background">
            <Setter.Value>
                <LinearGradientBrush EndPoint="0.442,0.005" StartPoint="0.558,0.995">
                    <GradientStop Color="#FFDBDBDB" />
                    <GradientStop Color="#FFFFFFFF" Offset="1" />
                </LinearGradientBrush>
            </Setter.Value>
        </Setter>
        <Setter Property="ItemTemplate">
            <Setter.Value>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <Rectangle
                                Width="8" Height="8"
                                Fill="{Binding FavoriteColor}"
                                Stroke="{Binding FavoriteColor}"
                                StrokeThickness="1" Margin="3"/>
                        <TextBlock Margin="3" Text="{Binding Name}"/>
                    </StackPanel>
                </DataTemplate>
            </Setter.Value>
        </Setter>
    </Style>

И вот разметка диаграммы:

    <toolkit:Chart x:Name="chart" LegendStyle="{StaticResource ColorByPreferenceLegend}">
        <toolkit:ColumnSeries IndependentValueBinding="{Binding Name}"
                           DependentValueBinding="{Binding Age}"
                           DataPointStyle="{StaticResource ColorByPreferenceColumn}" />
    </toolkit:Chart>

Наконец, вот как переопределить элементы легенды, где _students являетсяСписок объектов Студент:

    ColumnSeries cs = chart.Series[0] as ColumnSeries;
    cs.ItemsSource = _students;
    cs.LegendItems.Clear();
    foreach (Student s in _students)
        cs.LegendItems.Add(s);
1 голос
/ 20 ноября 2011

Один прием, который может сработать: сделать вашу текущую легенду невидимой через LegendStyle и вручную создать легенду.

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

...