【问题标题】:WrapPanel creates a new column for each dynamically expanding controlWrapPanel 为每个动态扩展控件创建一个新列
【发布时间】:2014-09-04 14:58:35
【问题描述】:

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

下图演示了这个问题。两个列表框的宽度相同,但不是将它们放在同一列中,而是其中一个最终变成了一半不可见。

我希望得到这个:

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

代码:

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

【问题讨论】:

  • 能否包含代码,这将有助于了解子控件的对齐属性的方向和值。
  • 有没有办法在不制作/使用自定义面板的情况下实现这一点?...不,没有,因为您的要求非常具体。但是,创建自定义 Panel 比您想象的要容易得多……只有两种方法可以覆盖:How to create a Custom Layout Panel in WPF

标签: c# wpf .net-4.5 wrappanel


【解决方案1】:

这里的问题是 WrapPanel 总是会给 ListBox 尽可能多的空间,直到 WrapPanel 中的可用高度。您希望发生的事情更像是 UniformGrid 效果,但仅用于扩展列中的 Height 元素,并且只要不违反 MinHeight 约束即可。这有点棘手,尤其是当您在 ListBox 元素或其他具有不同 MinHeight 约束的元素之间有其他固定高度的元素时。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 2015-10-17
    相关资源
    最近更新 更多