【问题标题】:Why does MeasureOverride receive the availableSize?为什么 MeasureOverride 会收到 availableSize?
【发布时间】:2014-05-09 21:27:48
【问题描述】:

如果父控件问它的子控件“你想要多大?”,那么传递的 availableSize 参数有什么用?我通过 Reflector 查看了 StackPanel 的源代码,但仍然无法弄清楚。

如果孩子想要150x30,那么即使availableSize是100x20,它仍然报告150x30,不是吗?如果期望孩子将自己限制为 availableSize,那么也可以对通过对孩子调用 MeasureOverride 返回的大小来完成 - 传递该参数没有意义。

有什么我没有考虑到的吗?

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    如果孩子想要150x30,那么即使availableSize是100x20,它仍然报告150x30,不是吗?

    这取决于控件,但通常答案是否定的。在任何情况下,关键是要让它有机会适应容器,但这不是必须的。

    想想 Grid 和 StackPanel 之间的区别。网格通常会根据可用大小精确调整自身大小。相比之下,StackPanel 将仅在一个方向上无限地调整自身大小(取决于其方向),而不管可用大小如何。在另一个方向上,它只会将自己扩展到其子项所需的空间,除非它的“Horizo​​ntalAlignment”/“VerticalAlignment”设置为“Stretch”,在这种情况下,它将自己伸展到可用的大小方向。

    ViewBox 是一个更复杂的示例,它充分利用了“availableSize”。它通常根据可用空间调整自身大小,并根据“Stretch”和“StretchDirection”的值缩放/拉伸其子项。

    【讨论】:

    • 我想我现在开始明白了。仍然很难区分测量和安排,因为这两种方法都在做。 ://
    【解决方案2】:

    关键是让元素有机会正确调整自身大小。毕竟,如果父控件不尊重可用大小,它可能会剪辑它。

    【讨论】:

    • 我认为这就是安排的目的。在 MeasureOverride 中,您报告您想要的大小,在 ArrangeOverride 中,您可以使用您所获得的任何空间。这不是更有意义吗?
    • @PavelMatuska 都是真的。该控件确实必须使用它在“ArrangeOverride”中给出的空间。但它也有机会提前适应其容器的大小。这就是 Grid 面板的作用,例如,或者许多将对齐设置为“拉伸”的控件。
    【解决方案3】:

    必须区分以下可能性:

    容器

    • 容器的大小不受限制 (ScrollViewer) 或想知道孩子需要多少空间。在这种情况下,MeasureOverride() 中的 availableSize 是无限的。
    • 容器大小有限。在这种情况下,MeasureOverride() 中的 availableSize 是有限的大小。

    儿童

    • 儿童可以调整到容器大小。在这种情况下,如果 availableSize 不是无限的,它会返回 availableSize。如果它是无限的并且 Child 不能自己计算大小,它可以返回 0。
    • 孩子的大小是固定的。在这种情况下,它不关心availableSize,而是返回固定大小。

    同样的事情在ArrangeOverride(Size arrangeBounds) 中再次发生,尽管大小可能不同。因此,不要使用在 MeasureOverride() 中计算的值,而是在 ArrangeOverride() 中重新计算它们。

    arrangeBounds 不能是无限的。容器不是无限的,而是传递在其 Arrange() 方法中计算的可用大小。孩子仍然可以使用不同的尺寸。如果它太大,容器会夹住它。如果太小,Container 需要以某种方式对齐它(ContentAlignment)。

    控件(Container、Child)是否固定大小还取决于 Width、MinWidth、MaxWidth、Horizo​​ntalAlignment 等属性。根据这些设置,控件在某些参数组合中需要固定大小,而在其他参数组合中则需要固定大小可以调整到可用的大小。

    【讨论】:

      猜你喜欢
      • 2021-06-23
      • 2017-10-10
      • 2023-04-05
      • 2016-08-21
      • 2014-07-04
      • 2020-06-06
      • 2018-12-26
      • 2021-03-05
      • 2013-07-13
      相关资源
      最近更新 更多