문제

실행 시간에 WPF TreeViewItem에서 텍스트의 너비를 어떻게 결정합니까?

오프셋을 계산하여 한 잎에서 다른 트리 뷰의 잎까지 선을 그릴 수 있습니다. 모든 '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;

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

다른 팁

당신은 텍스트 나 태그에 대해 그다지 구체적이지 않았으므로 .NET Framework의 TreeViewItem에 대해 생각하고 있다고 가정합니다.

더 쉬운 방법이있을 수 있지만 하나의 가능성은 그래픽을 사용하는 것입니다. 특정 글꼴을 사용하여 그릴 때 텍스트의 픽셀 크기를 제공합니다.

@mrphil : 달콤한 낙태 태아, 무섭습니다

myTreeViewItem.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
Size s = myTreeViewItem.DesiredSize;
return s.Width;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top