Comment déterminez-vous la largeur du texte dans un WPF TreeViewItem au moment de l'exécution?
-
06-09-2019 - |
Question
Comment déterminez-vous la largeur du texte dans un WPF TreeViewItem au moment de l'exécution?
Je dois calculer un décalage je peux tracer une ligne d'une feuille à la feuille d'un autre TreeView. Toutes les propriétés « width » renvoient une taille qui est beaucoup plus grande que l'espace occupé par le texte même du nœud. Il doit être possible car la fonction Select ne fait pas ressortir toute la ligne. J'écris le client dans WPF et Silverlight.
La solution 3
J'ai deux solutions:
A) Utilise l'arbre visuel
TreeViewItem selected = (TreeViewItem)dataSourceTreeView.SelectedItem;
double textWidth = 0;
double expanderWidth = 0;
Grid grid = (Grid)VisualTreeHelper.GetChild(selected, 0);
ToggleButton toggleButton = (ToggleButton)VisualTreeHelper.GetChild(grid, 0);
expanderWidth = toggleButton.ActualWidth;
Border bd = (Border)VisualTreeHelper.GetChild(grid, 1);
textWidth = bd.ActualWidth;
B) Si vous ne souhaitez pas utiliser l'arborescence visuelle
TreeViewItem selected = (TreeViewItem)dataSourceTreeView.SelectedItem;
double textWidth = 0;
Typeface typeface = new Typeface(selected.FontFamily,
selected.FontStyle, selected.FontWeight, selected.FontStretch);
GlyphTypeface glyphTypeface;
if (!typeface.TryGetGlyphTypeface(out glyphTypeface))
throw new InvalidOperationException("No glyphtypeface found");
string headerText = (string)selected.Header;
double size = selected.FontSize;
ushort[] glyphIndexes = new ushort[headerText.Length];
double[] advanceWidths = new double[headerText.Length];
for (int n = 0; n < headerText.Length; n++)
{
ushort glyphIndex = glyphTypeface.CharacterToGlyphMap[headerText[n]];
glyphIndexes[n] = glyphIndex;
double width = glyphTypeface.AdvanceWidths[glyphIndex] * size;
advanceWidths[n] = width;
textWidth += width;
}
Autres conseils
Vous n'étiez pas très précis sur le texte ou les balises, donc je suppose que vous prenez à propos TreeViewItem du Net Framework.
Il pourrait y avoir des moyens plus faciles, mais une possibilité est d'utiliser la méthode Graphics.MeasureString. Il vous donne la taille en pixels d'un texte quand il est dessiné en utilisant une police spécifique.
@mrphil: avorton Sweet, qui est effrayant
myTreeViewItem.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
Size s = myTreeViewItem.DesiredSize;
return s.Width;