WPF布局首先要求控件自行测量,然后根据它们在测量阶段产生的所需大小来安排控件。
在这种情况下,我看不出如何处理文字换行。
包含要包装的文本的控件必须知道其宽度才能计算其高度。但在测量阶段,宽度未知。所有测量完成后,它将由安排阶段分配。因此,在测量过程中无法计算高度。
文本换行如何在WPF中工作?
答案 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相同。如果不是这样,则文本布局将出错,文本将被截断。由于这种情况很少发生,可以通过调整父容器控件来防止,这是可以接受的。