실행 시간에 WPF TreeViewItem에서 텍스트의 너비를 어떻게 결정합니까?
-
06-09-2019 - |
문제
실행 시간에 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;
제휴하지 않습니다 StackOverflow