我有一个垂直的WarpPanel,在运行时填充了控件。控件的类型和数量在运行时确定。它适用于具有固定高度的控件,但根据其内容扩展的控件(例如,列表框)通常会创建一个新列。我不知何故需要强制面板将控件放在最后一列中,另一个是固定高度控件,除非列中的可用空间小于我们尝试放置的控件的MinHeight。不能选择设置控件的高度或最大高度。
下图显示了该问题。两个列表框的宽度是相同的,但不是将它们放在同一列中,而是其中一个最终是半隐形的。
而不是我希望得到这个:
有没有办法在不使用/使用自定义面板的情况下实现这一点?
代码:
**Panel:**
<WrapPanel x:Name="wp" Orientation="Vertical">
**Adding controls:**
private void AddControl(bool isListBox)
{
if (isListBox)
{
var lb = new ListBox();
lb.MinHeight = 310;
lb.Width = 310;
lb.MaxWidth = 310;
lb.MinWidth = 310;
wp.Children.Add(lb);
}
else
{
var cb = new ComboBox();
cb.Width = 310;
cb.MaxWidth = 310;
wp.Children.Add(cb);
}
}
答案 0 :(得分:2)
这里的问题是WrapPanel总是会给ListBox提供所需的空间,直到WrapPanel中的可用高度。你想要发生的事情更像是UniformGrid效果,但仅限于扩展列中的Height元素,并且只有在违反MinHeight约束时才会这样。这有点棘手,特别是如果ListBox元素之间有其他固定高度元素或具有不同MinHeight约束的其他元素。
可以进行计算,但我认为您需要创建自定义Panel才能获得此行为。基本上,它可以像WrapPanel代码一样工作,但是当你有可变高度元素(其中Measure在包装维度中返回无限大小的元素)时,它需要查看它们的MinHeight并使用同一列中的固定Height元素累积它们,最终将剩余的非固定高度除以可变元素的数量,以产生将在安排通行证中提供的高度。