1

如何在运行时确定 WPF TreeViewItem 中文本的宽度?

我需要计算一个偏移量,这样我就可以从一个叶子到另一个 TreeView 的叶子画一条线。所有 'width' 属性返回的大小都比节点的实际文本占用的空间大得多。这一定是可能的,因为选择功能不会突出显示整行。我正在用 WPF 和 Silverlight 编写客户端。

4

3 回答 3

1

您对文本或标签不是很具体,所以我假设您正在了解 .Net Framework 的 TreeViewItem。

可能有更简单的方法,但一种可能性是使用 Graphics.MeasureString 方法。当使用特定字体绘制时,它会为您提供以像素为单位的文本大小。

于 2009-05-26T22:26:28.243 回答
1

@mrphil:可爱的流产胎儿,太可怕了

myTreeViewItem.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
Size s = myTreeViewItem.DesiredSize;
return s.Width;
于 2009-05-28T06:20:04.867 回答
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;
    }
于 2009-05-27T19:33:39.543 回答