2017-07-11 4 views
1

J'ai des difficultés à régler la disposition de la légende de mon graphique C# dans VS2017. Quand je vais à Legends dans Properties je peux changer plusieurs propriétés mais je ne peux pas trouver comment changer la marge entre la frontière de la légende et ses articles (ainsi, le remplissage effectivement). Une autre propriété que je ne parviens pas à modifier: espacement entre les éléments de la légende. J'ai trouvé quelques discussions concernant les "fichiers de style", mais je voudrais éviter cela. J'ai aussi cherché différentes références qui pourraient me donner plus d'options, mais je n'ai rien trouvé.Comment modifier les propriétés de la légende du graphique

Alors, existe-t-il un moyen de modifier les propriétés d'une légende, autres que celles qui sont affichées dans Properties? J'espère trouver quelque chose comme: "myLegend.padding = 10pt".

+0

Est-ce un projet WPF ou WinForms? ASP.net? Quel paquet de graphiques utilisez-vous? –

+0

Il s'agit d'une application WinForms, utilisant .NET Framework 4. Pour le moment, je n'utilise pas de paquet graphique spécifique car le seul que je trouve est 'System.Windows.Forms.DataVisualization (.Charting)' et cela ne fait rien . – 10a

Répondre

1

Vous pouvez utiliser l'événement CustomizeLegend du graphique pour styler le Legend, son LegendItems et son LegendCells.

Le Margin que vous recherchez est une propriété de la LegendCell

Un objet de marges qui représente le haut, en bas, à gauche et à droite valeurs des marges de cellule de légende. Les valeurs par défaut pour le haut, le bas, à gauche et à droite sont "0,0,15,15".

Les marges sont mesurées en pourcentage de la taille de la police pour la légende cellule

Cela signifie que pour une LegendItem normale, qui se compose de deuxCells, une pour la série marqueur et un pour le texte, vous devez définir deux marges.

Voici un exemple; il crée une marge supérieure de 30%, aucune marge inférieure, également pour le 1er, la cellule de marqueur gauche une marge de 400% (gauche), pour la 2e cellule de texte (droite) une marge de droite de 200%. Un remplissage entre les cellules est ajouté à la cellule de texte et est 100%.:

private void chart1_CustomizeLegend(object sender, CustomizeLegendEventArgs e) 
{ 
    foreach (LegendItem lit in e.LegendItems) 
    { 
     var cells = lit.Cells; 
     cells[0].Margins = new Margins(30, 0, 400, 100); 
     cells[1].Margins = new Margins(30, 0, 0, 200); 
    } 
} 

Voyons voir en action; J'ai ajouté deux couleurs aux cellules afin que vous puissiez voir les zones respectives mieux:

enter image description here

Voici la mise à jour, le code dynamique:

cells[0].Margins = new Margins(tr_top.Value, tr_bot.Value, tr_ll.Value, tr_mm.Value); 
cells[1].Margins = new Margins(tr_top.Value, tr_bot.Value, tr_mm.Value, tr_rr.Value); 
+0

Comment appeler cet événement? Je l'ai essayé comme ceci: 'chart1.CustomizeLegend + = new System.xxx.Charting.CustomizeLegendEventArgs (chart1_CustomizedLegend)' et 'void chart_CustomizedLegend (expéditeur d'objet, CustomizeLegendEventArgs e)' mais alors j'obtiens le message: _cannot convertit de MethodGroup en LegendItemsCollection_. – 10a

+0

Vous l'accrochez comme toujours, mieux en double-cliquant dessus dans le volet des événements! Et vous ne l'appelez pas mais le déclenchez en appelant Invalidate().Sauf si vous faites des choses dynamiques comme mon dernier exemple, vous n'avez pas besoin de l'appeler du tout, car il sera appelé automatiquement à chaque fois que la légende est tirée. – TaW