2

我正在查看 MSDN 上的FrameworkElement.MesureOverride,试图了解布局引擎背后的机制。我偶然发现了这个有趣的笔记:

在此过程中,子元素可能会返回比初始 availableSize 更大的 DesiredSize 大小,以指示子元素需要更多空间。

行。我附近有反射器,所以我查看了调用 MesureOverride 的 MesureCore,我注意到,据我所知,MesureOverride 的返回值始终限制在 0 和 availableSize 之间。那是怎么回事?

4

2 回答 2

1

子元素可以要求更多空间。父元素是否尊重这一点取决于父元素。

MeasureCore 只调用 MeasureOverride this。你只了解了故事的一小部分。布局系统从调用元素树Measure的最顶层开始,它调用. 但是,在几个地方的电话中。PanelMeasureCorethisMeasureCoreFrameworkElementMeasureOverride

您在哪里看到它介于 0 和 availableSize 之间?

编辑:回复:“好吧,MeasureCore的最后一行......”

就像我说的,你看到的只是一小部分。

  1. 所有控件都有一种非常常见的方式来请求比实际需要更多的空间:Margin. 您必须编写一个自定义控件来请求比这更多的空间。
  2. MeasureCore据我所知,您在 中看到的约束与MinWidth/MinHeightMaxWidth/MaxHeight限制(如果已设置)有关。

所以是的,一个控件——就像文档说的那样——可以请求比需要更多的空间。除了它们的 s 之外,似乎没有一个默认控件这样做Margin,并且面板等容器不必尊重它。大多数情况下都不会利用您在文档中阅读的内容,因为在大多数情况下,从孩子父母的角度来看,这都是没有意义的。

如果您创建了 a UserControl,摆脱了 XAML 中的WidthandHeight值并覆盖MeasureOverride以返回任意Size,然后将它的实例放在 a 中Canvas,您会看到它显示在Size您返回的位置。

如果您正在创建自定义面板和自定义控件或用户控件,则布局系统的此功能可能有用,否则可能不会。但它就在那里。文档是正确的。

于 2009-08-07T13:44:39.930 回答
0

如果您从自己的方法返回Size> , (调用您的方法)会记住它,但会设置为 = 。这保证了子控件将适用于(例如)具有明确指定宽度/高度的网格单元。但是因为记得你的“未剪辑” ,你应该收到一个参数=你的原始。结果,您的控件“实际上”根据其原始控件排列子项,但实现将为此类父 Grid 单元格剪辑您的控件。具体的剪裁方式将取决于属性的实际值,例如(您的控件的属性)。availableSizeMeasureOverrideFrameworkElement.MeasureCoreDesiredSizeavailableSizeFrameworkElement.MeasureCoreDesiredSizeArrangeOverrideDesiredSizeDesiredSizeFrameworkElementHorizontal/VerticalAlignment

于 2012-01-10T13:16:12.663 回答