WrapPanel为每个动态扩展控件创建一个新列

时间:2014-09-04 14:58:36

标签: c# wpf .net-4.5 wrappanel

我有一个垂直的WarpPanel,在运行时填充了控件。控件的类型和数量在运行时确定。它适用于具有固定高度的控件,但根据其内容扩展的控件(例如,列表框)通常会创建一个新列。我不知何故需要强制面板将控件放在最后一列中,另一个是固定高度控件,除非列中的可用空间小于我们尝试放置的控件的MinHeight。不能选择设置控件的高度或最大高度。

下图显示了该问题。两个列表框的宽度是相同的,但不是将它们放在同一列中,而是其中一个最终是半隐形的。

而不是我希望得到这个:

enter image description here

有没有办法在不使用/使用自定义面板的情况下实现这一点?

代码:

**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);
    }
}

1 个答案:

答案 0 :(得分:2)

这里的问题是WrapPanel总是会给ListBox提供所需的空间,直到WrapPanel中的可用高度。你想要发生的事情更像是UniformGrid效果,但仅限于扩展列中的Height元素,并且只有在违反MinHeight约束时才会这样。这有点棘手,特别是如果ListBox元素之间有其他固定高度元素或具有不同MinHeight约束的其他元素。

可以进行计算,但我认为您需要创建自定义Panel才能获得此行为。基本上,它可以像WrapPanel代码一样工作,但是当你有可变高度元素(其中Measure在包装维度中返回无限大小的元素)时,它需要查看它们的MinHeight并使用同一列中的固定Height元素累积它们,最终将剩余的非固定高度除以可变元素的数量,以产生将在安排通行证中提供的高度。