2010-08-29 6 views
19

J'essaie d'utiliser des graphiques de la boîte à outils WPF (avec LineSeries) et je ne souhaite pas du tout de légende. J'ai besoin de cela car j'ai 10 de ces graphiques avec des données provenant d'une source différente et je voudrais dessiner une légende pour tous les 10, pour sauver l'écran immobilier.Masquer la légende du graphique de la boîte à outils WPF avec plusieurs séries de données

Par défaut, la légende apparaît au moment où vous ajoutez une deuxième LineSeries. Y a-t-il un moyen de l'empêcher d'apparaître?

Merci,

sprite.

+0

J'utilise la version Février 2010 de la boîte à outils WPF. – sprite

Répondre

43

Il ne semble pas y avoir de méthode particulièrement propre. Une approche simple est de définir la largeur de la légende à zéro en utilisant LegendStyle:

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

Une approche plus radicale est de remplacer le ControlTemplate avec celui qui ne comprend pas une légende:

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

Utilisez les espaces de noms suivants:

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

Merci Quarermeister. J'ai pris la deuxième approche. Je suis juste venu poster la réponse moi-même, mais vous m'avez sauvé la peine. Je l'ai également utilisé pour minimiser les marges autour de la zone de traçage et le titre à un strict minimum afin que je puisse empiler toutes mes cartes dans le moins d'espace possible. – sprite

+3

hey. Pourriez-vous clarifier: quel est l'espace de noms datavis? –

8

J'ai essayé l'approche de Quarermeister mais son a une référence à un ensemble « de Datavis » dans l'attribut TargetType que je n'ai pas eu.

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

Je devais aussi ajouter un rembourrage sur le côté droit du tableau, car sans la légende, mes étiquettes d'intervalle axe x prolongeaient en dehors de la zone de graphique.

+3

Vous l'avez, vous avez juste besoin d'ajouter l'espace de noms: xmlns: datavis = "espace de noms clr: System.Windows.Controls.DataVisualization; assembly = System.Windows.Controls.DataVisualization.Toolkit" – codekaizen

9

approche beaucoup plus sensible ...

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

ont mieux fonctionné pour moi que les valeurs de réglage à 0 ... Cheers!

+1

Je suis d'accord que cela semble être une approche plus raisonnable, mais j'ai eu quelques problèmes. D'abord, l'approche ci-dessus ne fait qu'effacer les objets et la case Légende apparaît toujours. (Corrigé en appliquant plutôt le style au graphique, notez que la classe Legend est dans un espace de noms différent du graphique). Puis je suis tombé sur le deuxième problème: Collapsed semble fonctionner immédiatement en mode design, mais après un rafraîchissement (par exemple la construction du projet) et lors de l'exécution de l'application, la légende apparaît. Donc à la fin j'ai dû ajouter une largeur = 0 setter aussi :( – Ben

5

Propriété Attached pour les peaux sèches, utilisation facile:

<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 
    } 
Questions connexes