Frage

Wie bestimmen Sie die Breite des Textes in einer WPF TreeViewItem zur Laufzeit?

Ich muss ein Offset berechnen, so kann ich eine Linie von einem Blatt zum Blatt eines anderen TreeView ziehen. Alle ‚width‘ Eigenschaften zurückgeben eine Größe, die viel größer ist als der Raum ist durch den tatsächlichen Text des Knotens aufgenommen. Es muss möglich sein, weil die Select-Funktion nicht die gesamte Zeile nicht markieren. Ich schreibe den Client in WPF und Silverlight.

War es hilfreich?

Lösung 3

Ich habe zwei Lösungen:

A) Verwendet die visuelle Struktur

    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) Wenn Sie nicht wollen, die visuelle Struktur verwenden,

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

Andere Tipps

Sie waren auf den Text oder die Tags nicht sehr spezifisch, so dass ich nehme an, dass Sie über das .NET Framework TreeViewItem einnehmen.

Es könnte einfache Art und Weise sein, aber eine Möglichkeit ist, die Graphics.MeasureString Methode zu verwenden. Es gibt Ihnen die Größe in Pixeln eines Textes, wenn eine bestimmte Schriftart gezeichnet werden.

@mrphil: Süße abgetriebenen Fötus, das ist beängstigend

myTreeViewItem.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
Size s = myTreeViewItem.DesiredSize;
return s.Width;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top