كيف يمكنك تحديد عرض النص في WPF TreeViewItem في وقت التشغيل؟

StackOverflow https://stackoverflow.com/questions/913053

سؤال

وكيف تحدد عرض النص في 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;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top