我从处理 WPF 中的子类化 Panel 并实现自己的布局工作以及获取 Infinity 或 PositiveInfinity 的人那里发现了一些其他问题,该维度传递给 availableSize arg 中的 MeasureOverride。回答通常是,“这意味着您可以占用尽可能多的空间:忽略它,将所有孩子的所需尺寸相加并返回。”
就我而言,我正在制作一个动态调整大小以填充可用空间的控件,因此没有所需大小的内在概念。它只想使用整个可用大小。
当我构建 ControlTemplate 时,它最终嵌套在 StackPanel 中,并且它开始为可用高度获取 Infinity,即使控件没有滚动条。如果我只是将它限制在某个固定数字,它只会夹在窗口上。我尝试返回 ActualHeight,但这不起作用,因为它是周期性的:在我完成完整的布局传递之前没有 ActualHeight。所以那总是0.0。
刚开始不知道是StackPanel下Infinity,翻了一阵子参考源也没有用,最后用VisualTreeHelper跑遍了父母,看他们的ActualHeight,发现StackPanel是最深的高度非零。我把它改成了 DockPanel,因为我只需要两个控件,所以它和 StackPanel 一样有效。看哪,DockPanel 没有通过 Infinity 的可用高度。
但这只是一种解决方法。我想更深入地了解布局背后的理念以及为什么没有滚动条的标准容器之一会告诉我我可以拥有尽可能多的空间。对此的“正确”回应是什么?