在MeasureOverride(WPF面板)中,当我没有固有的期望大小时,如何处理availableSize中的无穷大值?

bsh*_*arp 6 c# wpf mvvm

我在WPF中处理子类化Panel并实现自己的布局工作,并在availableSize arg中传递给MeasureOverride的维度获得Infinity或PositiveInfinity时,我发现了一些其他问题.回答通常是,"这意味着你可以占用尽可能多的空间:忽略它,加上你所有孩子所需的大小,并将其归还."

在我的情况下,我正在制作一个动态调整大小以填充可用空间的控件,因此没有所需大小的内在概念.它只是想使用整个availableSize.

当我构建ControlTemplate时,它最终嵌套在StackPanel中,并且它开始获得Infinity的可用高度,即使控件没有滚动条.如果我只是将它限制在某个固定的数字上,它就会在窗口上剪辑.我尝试返回ActualHeight,但这不起作用,因为它是循环的:在我完成完整布局传递之前没有ActualHeight.所以这总是0.0.

起初我不知道是StackPanel传递无限并且通过参考源挖了一段时间无济于事,最后通过使用VisualTreeHelper来运行父母并查看他们的ActualHeight并且StackPanel是最深的一个非零高度.我把它改成了DockPanel,因为我只需要两个控件,所以它和StackPanel一样.不料,DockPanel没有通过Infinity的可用高度.

但这只是一种解决方法; 我想更深入地了解布局背后的原理以及为什么没有滚动条的标准容器会告诉我我可以拥有所需的空间.什么是"正确"的回应?

Hen*_*man 2

这:

我正在制作一个可以动态调整大小以填充可用空间的控件,

与以下组合是一个不好的组合:

它最终嵌套在 StackPanel 中

“填充空间”的控件不应位于堆栈面板内。您认为应该是多大尺寸?

当然,ScrollPanel 也是如此。