Domanda

Come si determina la larghezza del testo in un WPF TreeViewItem in fase di esecuzione?

Ho bisogno di calcolare un offset in modo da poter tracciare una linea da una foglia foglia di un TreeView diversa. Tutte le proprietà 'width' restituiscono una dimensione che è molto più grande rispetto allo spazio occupato dal testo effettivo del nodo. Deve essere possibile poiché la funzione Select non evidenziare l'intera riga. Sto scrivendo il cliente in WPF e Silverlight.

È stato utile?

Soluzione 3

Ho due soluzioni:

A) Utilizza la struttura visiva

    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) Se non si desidera utilizzare la struttura ad albero visuale

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

Altri suggerimenti

Non sei stato molto specifico sul testo o sulle etichette, in modo da sto supponendo che si sta prendendo circa TreeViewItem del .Net Framework.

Ci potrebbero essere modi più facili, ma una possibilità è quella di utilizzare il metodo Graphics.MeasureString. Ti dà la dimensione in pixel di un testo quando viene disegnata utilizzando un carattere specifico.

@mrphil: dolce feto abortito, che fa paura

myTreeViewItem.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
Size s = myTreeViewItem.DesiredSize;
return s.Width;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top