【发布时间】:2016-02-07 22:22:23
【问题描述】:
WPF 布局的工作原理是首先要求控件测量自身,然后根据它们在测量阶段生成的所需大小来排列控件。
我看不出在这种情况下如何处理文本换行。
包含要换行的文本的控件必须先知道其宽度,然后才能计算其高度。但在测量阶段宽度是未知的。当所有测量完成后,它将由排列阶段分配。所以测量时无法计算高度。
文本换行在 WPF 中是如何工作的?
【问题讨论】:
-
“但在测量阶段宽度未知。”那你觉得
availableSize参数是干什么用的?请记住,布局是递归完成的。 -
@Clemens 是正确的。可用宽度在测量期间传入。所以包裹的文本将宽度然后向下扩展。
-
@Clemens availableWidth 是在子容器上完成任何布局之前父容器中的总可用宽度。分配给文本控件的最终宽度不一定与 availableWidth 具有相同的值。如果有,那么测量阶段将是多余的。在调用 Arrange 之前,文本控件不知道其实际宽度。
-
带环绕的文本布局是根据测量阶段的可用宽度完成的。如果在极少数情况下最终宽度小于该值,则文本将在 x 维度上被截断,它不会重新计算换行,正如您似乎暗示的那样。
-
"availableWidth 是在任何布局完成之前父容器中的总可用宽度"。我建议您尝试以下操作:创建一个 FrameworkElement 派生类,覆盖其 MeasureOverride 和 ArrangeOverride 方法,添加一些大小的调试输出并调用基类方法。然后将该元素放在一个 2x2 的网格中,该网格填充了窗口区域。调整窗口大小并观察调试输出。