Как вы определяете ширину текста в WPF TreeViewItem во время выполнения? - PullRequest
1 голос
/ 27 мая 2009

Как вы определяете ширину текста в WPF TreeViewItem во время выполнения?

Мне нужно рассчитать смещение, чтобы я мог нарисовать линию от одного листа до листа другого TreeView. Все свойства 'width' возвращают размер, который намного больше, чем пространство, занимаемое фактическим текстом узла. Это должно быть возможно, потому что функция Выбрать не выделяет всю строку. Я пишу клиент в WPF и Silverlight.

Ответы [ 3 ]

1 голос
/ 28 мая 2009

@ mrphil: сладко прерванный плод, это страшно

myTreeViewItem.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
Size s = myTreeViewItem.DesiredSize;
return s.Width;
1 голос
/ 27 мая 2009

Вы не очень точно указали текст или теги, поэтому я предполагаю, что вы рассматриваете TreeViewItem .Net Framework.

Возможно, есть более простые способы, но одна из возможностей - использовать метод Graphics.MeasureString. Это дает вам размер в пикселях текста при рисовании с использованием определенного шрифта.

0 голосов
/ 27 мая 2009

У меня есть два решения:

А) Использует визуальное дерево

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