WPF布局如何处理文本换行

时间:2016-02-07 22:22:23

标签: wpf text wrapping

WPF布局首先要求控件自行测量,然后根据它们在测量阶段产生的所需大小来安排控件。

在这种情况下,我看不出如何处理文字换行。

包含要包装的文本的控件必须知道其宽度才能计算其高度。但在测量阶段,宽度未知。所有测量完成后,它将由安排阶段分配。因此,在测量过程中无法计算高度。

文本换行如何在WPF中工作?

2 个答案:

答案 0 :(得分:0)

这个非常简单的自定义TextBlock显示了它的工作原理:

public class MyTextBlock : FrameworkElement
{
    private FormattedText formattedText;

    public static readonly DependencyProperty TextProperty =
        DependencyProperty.Register(
            "Text", typeof(string), typeof(MyTextBlock),
            new FrameworkPropertyMetadata(
                null,
                FrameworkPropertyMetadataOptions.AffectsMeasure,
                (o, e) =>
                {
                    ((MyTextBlock)o).formattedText = new FormattedText(
                        (string)e.NewValue,
                        CultureInfo.InvariantCulture,
                        FlowDirection.LeftToRight,
                        new Typeface("Segoe UI"),
                        24,
                        Brushes.Black);
                }));

    public string Text
    {
        get { return (string)GetValue(TextProperty); }
        set { SetValue(TextProperty, value); }
    }

    protected override Size MeasureOverride(Size availableSize)
    {
        var size = new Size();

        if (formattedText != null)
        {
            formattedText.MaxTextWidth = availableSize.Width;
            size.Width = formattedText.Width;
            size.Height = Math.Min(formattedText.Height, availableSize.Height);
        }

        return size;
    }

    protected override Size ArrangeOverride(Size finalSize)
    {
        if (formattedText != null)
        {
            formattedText.MaxTextWidth = finalSize.Width;
            formattedText.MaxTextHeight = finalSize.Height;
        }

        return finalSize;
    }

    protected override void OnRender(DrawingContext drawingContext)
    {
        base.OnRender(drawingContext);

        if (formattedText != null)
        {
            drawingContext.DrawText(formattedText, new Point());
        }
    }
}

答案 1 :(得分:0)

似乎WPF文本控件假设控件的最终大小与Measure阶段的availableSize相同。如果不是这样,则文本布局将出错,文本将被截断。由于这种情况很少发生,可以通过调整父容器控件来防止,这是可以接受的。