1

実行時に WPF TreeViewItem のテキストの幅をどのように決定しますか?

あるリーフから別の TreeView のリーフに線を引くことができるように、オフセットを計算する必要があります。すべての「幅」プロパティは、ノードの実際のテキストが占めるスペースよりもはるかに大きいサイズを返します。選択機能では行全体が強調表示されないため、可能である必要があります。クライアントを WPF と Silverlight で作成しています。

4

3 に答える 3

1

テキストやタグについてあまり具体的ではなかったので、.Net Framework の TreeViewItem について考えていると思います。

もっと簡単な方法があるかもしれませんが、可能性の 1 つは 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

私には2つの解決策があります:

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 に答える