Pergunta

Como você determina a largura do texto em um WPF TreeViewItem em tempo de execução?

Eu preciso calcular um deslocamento para que eu possa desenhar uma linha de uma folha para a folha de uma TreeView diferente. Todas as propriedades 'width' retornar um tamanho que é muito maior do que o espaço ocupado pelo texto actual do nó. Deve ser possível porque o recurso Select não destacar a linha inteira. Eu estou escrevendo o cliente em WPF e Silverlight.

Foi útil?

Solução 3

Eu tenho duas soluções:

A) Utiliza a árvore visual

    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 você não quiser usar a árvore visual

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

Outras dicas

Você não era muito específico sobre o texto ou as tags, então eu estou supondo que você está tomando sobre TreeViewItem do .NET Framework.

Pode haver maneiras mais fáceis, mas uma possibilidade é usar o método Graphics.MeasureString. Dá-lhe o tamanho em pixels de um texto quando desenhado usando uma fonte específica.

@mrphil: Sweet abortado o feto, isso é assustador

myTreeViewItem.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
Size s = myTreeViewItem.DesiredSize;
return s.Width;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top