Come si determina la larghezza del testo in un WPF TreeViewItem in fase di esecuzione?
-
06-09-2019 - |
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.
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;