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

StackOverflow https://stackoverflow.com/questions/913053

Вопрос

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

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

Это было полезно?

Решение 3

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

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;

Б) Если вы не хотите использовать визуальное дерево

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

Другие советы

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

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

@mrphil:Милый абортированный плод, это страшно

myTreeViewItem.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
Size s = myTreeViewItem.DesiredSize;
return s.Width;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top