如何在运行时确定WPF TreeViewItem中文本的宽度?
我需要计算一个偏移量,这样我就可以从一个叶子到另一个TreeView的叶子画一条线。所有'width'属性返回的大小都比节点的实际文本占用的空间大。必须是可能的,因为“选择”功能不会突出显示整行。我正在用WPF和Silverlight编写客户端。
答案 0 :(得分:1)
你对文本或标签不太具体,所以我假设你正在使用.Net Framework的TreeViewItem。
可能有更简单的方法,但有一种可能性是使用Graphics.MeasureString方法。当使用特定字体绘制时,它会为您提供文本的像素大小。
答案 1 :(得分:1)
@mrphil:甜蜜流产的胎儿,那是可怕的
myTreeViewItem.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
Size s = myTreeViewItem.DesiredSize;
return s.Width;
答案 2 :(得分:0)
我有两个解决方案:
A)使用视觉树
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)如果您不想使用可视树
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;
}