実行時に WPF TreeViewItem 内のテキストの幅をどのように決定しますか?
-
06-09-2019 - |
質問
実行時に WPF TreeViewItem 内のテキストの幅をどのように決定しますか?
あるリーフから別の TreeView のリーフまで線を引くことができるように、オフセットを計算する必要があります。すべての「width」プロパティは、ノードの実際のテキストが占めるスペースよりもはるかに大きなサイズを返します。選択機能では行全体が強調表示されないため、これは可能なはずです。私は WPF と Silverlight でクライアントを作成しています。
解決 3
私は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;
}
他のヒント
テキストやタグについてあまり具体的ではなかったので、.Net Framework の TreeViewItem について理解していると思います。
もっと簡単な方法があるかもしれませんが、可能性の 1 つは Graphics.MeasureString メソッドを使用することです。特定のフォントを使用して描画されたテキストのサイズをピクセル単位で示します。
@mrphil:スウィート流産した胎児、それは怖いです。
myTreeViewItem.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
Size s = myTreeViewItem.DesiredSize;
return s.Width;
所属していません StackOverflow