如果父控件问其子控件“您希望有多大?”,那么传递的availableSize参数有什么用?我已经通过Reflector窥视了StackPanel的源代码,但我仍然无法弄清楚。
如果孩子想要150 x30,那么即使availableSize是100 x20,它仍然报告150 x30,不是吗?如果期望子对象将自己限制在availableSize上,那么最好在调用子MeasureOverride时返回的大小上这样做--传递该参数没有任何意义。
有什么我没考虑到的吗?
发布于 2014-05-09 21:43:04
如果孩子想要150 x30,那么即使availableSize是100 x20,它仍然报告150 x30,不是吗?
这取决于控制,但总体上答案是否定的。无论如何,重点是让它有机会适合自己的容器,但它不需要这样做。
考虑一下网格和StackPanel之间的区别。网格通常会将自己精确地调整到可用的大小。相反,StackPanel只在一个方向上无限地调整自身大小(取决于它的方向),而不考虑可用的大小。在另一个方向上,它只会扩展到其子程序所需的空间,除非它的"HorizontalAlignment“/ "VerticalAlignment”设置为“拉伸”,在这种情况下,它将扩展到该方向上的可用大小。
ViewBox是一个更复杂的示例,它很好地利用了"availableSize“。它通常根据可用空间来调整自身大小,并根据“拉伸”和"StretchDirection“的值来缩放/扩展其子级。
发布于 2014-05-09 21:35:22
关键是要让元素有机会正确地调整自己的大小。毕竟,如果父控件不尊重可用的大小,它可能会剪短它。
发布于 2015-01-17 08:12:31
必须区分以下几种可能性:
容器
儿童
同样的情况在ArrangeOverride(Size arrangeBounds)中再次发生,尽管大小可能不同。因此,不要使用在MeasureOverride()中计算的值,而是在ArrangeOverride()中重新计算它们。
arrangeBounds不可能是无限的。容器传递的不是无穷大,而是传递在其安排()方法中计算出来的可用大小。孩子仍然可以使用不同的尺寸。如果它太大了,容器就会把它夹起来。如果它太小,容器需要对齐它(ContentAlignment)。
如果控件(容器、子控件)的大小是固定的,那么也取决于诸如宽度、MinWidth、MaxWidth、HorizontalAlignment等属性。根据这些设置,控件要求在某些参数组合中使用固定大小,而在另一些参数组合中,控件可以根据可用大小进行调整。
https://stackoverflow.com/questions/23574264
复制相似问题