gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:40:10 26 4
gpt4 key购买 nike

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

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

相反,我希望得到这个:

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

最佳答案

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

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

关于c# - WrapPanel 为每个动态扩展控件创建一个新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25668765/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com