2010-08-29 16 views
19

Sto tentando di utilizzare i grafici dal WPF Toolkit (con LineSeries) e non desidero affatto una legenda. Ho bisogno di questo dato che ho 10 di questi grafici ciascuno con dati provenienti da una fonte diversa e vorrei disegnare una legenda per tutti e 10, per salvare lo schermo immobiliare.Nascondere la legenda del grafico WPF Toolkit con più di una serie di dati

Per impostazione predefinita, la legenda appare nel momento in cui si aggiunge un secondo LineSeries. C'è un modo per impedirgli di apparire?

Grazie,

sprite.

+0

Sto usando il rilascio di febbraio 2010 di WPF Toolkit. – sprite

risposta

43

Non sembra esserci un modo particolarmente pulito. Un approccio semplice è quello di impostare Larghezza della leggenda a zero usando LegendStyle:

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

Un approccio più drastico è quello di sostituire la ControlTemplate con uno che non include una Leggenda:

<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> 

utilizzare i seguenti spazi dei nomi:

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" 
+1

Grazie Quarermeister. Ho preso il secondo approccio. Sono appena venuto a postare la risposta da solo, ma mi hai salvato il problema. L'ho anche usato per ridurre al minimo i margini attorno all'area del plot e al titolo, così ho potuto raggruppare tutti i miei grafici nel minor spazio possibile. – sprite

+3

hey. Potresti chiarire: qual è il namespace di datavis? –

8

ho provato l'approccio di Quarermeister ma la sua ha un riferimento a un gruppo di "datavis" nell'attributo TargetType che non ho avuto.

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

Ho anche dovuto aggiungere rivestimento sul lato destro del grafico perché senza la legenda, miei dell'asse x intervallo etichette estendevano fuori dell'area del grafico.

+3

Ce l'hai, devi solo aggiungere lo spazio dei nomi: xmlns: datavis = "clr-namespace: System.Windows.Controls.DataVisualization; assembly = System.Windows.Controls.DataVisualization.Toolkit" – codekaizen

9

approccio molto più sensato ...

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

funzionato meglio per me che i valori di impostazione a 0 ... Cheers!

+1

Sono d'accordo che questo sembra un approccio più ragionevole, ma ho avuto un paio di problemi. In primo luogo, l'approccio di cui sopra collassa solo gli oggetti e quindi la casella Legenda si presenta ancora. (Risolto invece applicando lo stile al grafico, nota che la classe Legend è in un diverso spazio dei nomi per tracciare un grafico). Poi mi sono imbattuto nel secondo numero: Collapsed sembra funzionare immediatamente in modalità di progettazione, ma dopo un aggiornamento (ad esempio, la costruzione del progetto) e quando si esegue l'app viene visualizzata la legenda. Quindi alla fine ho dovuto aggiungere anche una larghezza = 0 setter :( – Ben

5

proprietà associata per pelli secche, facile utilizzo:

<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 
    } 
Problemi correlati