كيف يمكنك تحديد عرض النص في WPF TreeViewItem في وقت التشغيل؟
-
06-09-2019 - |
سؤال
وكيف تحدد عرض النص في WPF TreeViewItem في وقت التشغيل؟
وأحتاج لحساب إزاحة حتى أتمكن من رسم خط من ورقة واحدة إلى ورقة من تريفيف مختلفة. كافة الخصائص "العرض" بإرجاع حجم هذا هو الطريق أكبر من المساحة التي تولاها النص الفعلي للعقدة. يجب أن يكون ممكنا لأن تحديد الميزة لا تسليط الضوء على الصف بأكمله. أنا أكتب العميل في 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;
}
نصائح أخرى
وأنت لم تكن محددة جدا على النص أو العلامات، لذلك أفترض أنك تتناولين حول TreeViewItem صافي الإطار ل.
وربما يكون هناك أسهل الطرق، ولكن احتمال واحد هو استخدام طريقة Graphics.MeasureString. فهو يوفر لك حجم بالبكسل من النص عند رسمها باستخدام خط معين.
وmrphil: الجنين المجهض الحلو، وهذا مخيف
myTreeViewItem.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
Size s = myTreeViewItem.DesiredSize;
return s.Width;
لا تنتمي إلى StackOverflow