Comment déterminez-vous la largeur du texte dans un WPF TreeViewItem au moment de l'exécution?

StackOverflow https://stackoverflow.com/questions/913053

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.

Était-ce utile?

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top