Скрыть легенду диаграммы WPF Toolkit с более чем одним рядом данных

Я пытаюсь использовать диаграммы из набора инструментов WPF (с LineSeries), и мне вообще не нужна легенда. Мне это нужно, так как у меня есть 10 таких диаграмм, каждая с данными из разных источников, и я хотел бы нарисовать одну легенду для всех 10, чтобы сэкономить место на экране.

По умолчанию легенда появляется в момент добавления второго LineSeries. Есть ли способ предотвратить его даже появление?

Спасибо,

спрайт.


person sprite    schedule 29.08.2010    source источник
comment
Я использую выпуск WPF Toolkit от февраля 2010 года.   -  person sprite    schedule 29.08.2010


Ответы (4)


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

<charting:Chart>
    <charting:Chart.LegendStyle>
        <Style TargetType="datavis:Legend">
            <Setter Property="Width" Value="0" />
        </Style>
    </charting:Chart.LegendStyle>

Более радикальный подход — заменить ControlTemplate тем, который не включает легенду:

<charting:Chart>
    <charting:Chart.Template>
        <ControlTemplate TargetType="{x:Type charting:Chart}">
            <Border Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Padding="{TemplateBinding Padding}">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="*" />
                    </Grid.RowDefinitions>
                    <datavis:Title Content="{TemplateBinding Title}" Style="{TemplateBinding TitleStyle}" />
                    <chartingprimitives:EdgePanel Name="ChartArea" Style="{TemplateBinding ChartAreaStyle}" Grid.Row="1" Margin="0,15,0,15">
                        <Grid Panel.ZIndex="-1" Style="{TemplateBinding PlotAreaStyle}" />
                        <Border Panel.ZIndex="10" BorderBrush="#FF919191" BorderThickness="1" />
                    </chartingprimitives:EdgePanel>
                </Grid>
            </Border>
        </ControlTemplate>
    </charting:Chart.Template>

Используйте следующие пространства имен:

xmlns:charting="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit"
xmlns:datavis="clr-namespace:System.Windows.Controls.DataVisualization;assembly=System.Windows.Controls.DataVisualization.Toolkit"
xmlns:chartingprimitives="clr-namespace:System.Windows.Controls.DataVisualization.Charting.Primitives;assembly=System.Windows.Controls.DataVisualization.Toolkit"
person Quartermeister    schedule 29.08.2010
comment
Спасибо Кварермейстер. Я выбрал второй подход. Я только что пришел, чтобы опубликовать ответ сам, но вы избавили меня от проблем. Я также использовал его, чтобы минимизировать поля вокруг области графика и заголовка до минимума, чтобы я мог сложить все свои диаграммы вместе на как можно меньшем пространстве. - person sprite; 30.08.2010
comment
Привет. Не могли бы вы уточнить: что такое пространство имен datavis? - person Arsen Zahray; 16.04.2012

Я попробовал подход Quarermeister, но у него есть ссылка на сборку «datavis» в атрибуте TargetType, которого у меня не было.

<chartingToolkit:Chart.LegendStyle>
    <Style TargetType="Control">
        <Setter Property="Width" Value="0" />
        <Setter Property="Height" Value="0" />
    </Style>
</chartingToolkit:Chart.LegendStyle>

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

person mtlynch    schedule 30.06.2011
comment
Он у вас есть, вам просто нужно добавить пространство имен: xmlns:datavis=clr-namespace:System.Windows.Controls.DataVisualization;assembly=System.Windows.Controls.DataVisualization.Toolkit - person codekaizen; 16.09.2011

Более разумный подход...

<charting:LineSeries.LegendItemStyle >
  <Style TargetType="{x:Type charting:LegendItem}">
     <Setter Property="Visibility" Value="Collapsed"/>
  </Style>
</charting:LineSeries.LegendItemStyle>

У меня сработало лучше, чем установка значений на 0... Ура!

person JohnBlacker    schedule 13.05.2012
comment
Я согласен, что это кажется более разумным подходом, но у меня было несколько вопросов. Во-первых, описанный выше подход только сворачивает элементы, поэтому поле «Легенда» все еще отображается. (Исправлено путем применения стиля к диаграмме, обратите внимание, что класс Legend находится в другом пространстве имен для диаграммы). Затем я столкнулся со второй проблемой: Collapsed работает сразу в режиме разработки, но после обновления (например, при создании проекта) и при запуске приложения появляется легенда. Таким образом, в конце концов мне пришлось добавить сеттер width=0 :( - person Ben; 28.12.2014

Прикрепленное свойство для DRY, простое использование:

<charting:Chart helpers:ChartHelpers.IsLegendHidden="True" ...

public static class ChartHelpers
    {
        static ChartHelpers()
        {
            HideLegendStyle = new Style(typeof(Legend));
            HideLegendStyle.Setters.Add(new Setter(Legend.WidthProperty, 0.0));
            HideLegendStyle.Setters.Add(new Setter(Legend.HeightProperty, 0.0));
            HideLegendStyle.Setters.Add(new Setter(Legend.VisibilityProperty, Visibility.Collapsed));
        }

        /// <summary>Gets a <see cref="Style"/> to hide the legend.</summary>
        public static readonly Style HideLegendStyle;

        #region IsLegendHidden

        [Category("Common")]
        [AttachedPropertyBrowsableForType(typeof(Chart))]
        public static bool GetIsLegendHidden(Chart chart)
        {
            return (bool)chart.GetValue(IsLegendHiddenProperty);
        }
        public static void SetIsLegendHidden(Chart chart, bool value)
        {
            chart.SetValue(IsLegendHiddenProperty, value);
        }

        public static readonly DependencyProperty IsLegendHiddenProperty = 
            DependencyProperty.RegisterAttached(
                "IsLegendHidden",
                typeof(bool), // type
                typeof(ChartHelpers), // containing static class
                new PropertyMetadata(default(bool), OnIsLegendHiddenChanged)
                );

        private static void OnIsLegendHiddenChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            OnIsLegendHiddenChanged((Chart)d, (bool)e.NewValue);
        }
        private static void OnIsLegendHiddenChanged(Chart chart, bool isHidden)
        {
            if (isHidden)
            {
                chart.LegendStyle = HideLegendStyle;
            }
        }

        #endregion IsLegendHidden
    }
person Jake Berger    schedule 26.06.2012