【问题标题】:How to adjust WrapPanel height dynamically based on content?如何根据内容动态调整 WrapPanel 高度?
【发布时间】:2011-04-26 17:22:14
【问题描述】:

我正在开发一个 WPF 应用程序。在这个应用程序中,我有一个包含 WrapPanel 的窗口。 WrapPanel 内部是一系列具有不同高度但宽度相同的 StackPanel。 StackPanel 的数量和大小在设计时是未知的(它们是动态生成的)。

这些 StackPanel 通常会很好地堆叠在一起,然后在 WrapPanel 中没有更多空间时“换行”到另一列。为了实现这一点,我必须为 WrapPanel 设置一个固定的高度(高度设置为“自动”,它将继续沿着页面向下而不是换行到另一列)。但是,当偶然我有一个太大而无法容纳 WrapPanel 高度的 StackPanel 时,它就会被截断。这种情况的图像如下。

我的问题是,我可以在Show()这个给用户之前查询每个StackPanel的高度,并根据最大的StackPanel设置WrapPanel高度吗?有一个更好的方法吗?

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    首先,您是否确保此问题不是由 WrapPanel 达到其最大可用尺寸(即其大小受其父窗口或元素限制)引起的?因为如果是这种情况,那么您将需要重新调整整体布局,或者将其包装在 ScrollViewer 中。

    如果不是上述情况,并且 WrapPanel 有足够的“成长”空间,这确实看起来是一个奇怪的问题。你说 StackPanels 是动态生成的。所以在你的代码中,你必须调用myWrapPanel.Children.Add(stackPanel)。在这行代码之后,您可以尝试添加如下内容:

    myWrapPanel.Height = myWrapPanel.Children.Cast<FrameworkElement>().Max(e => e.ActualHeight);
    

    编辑:刚刚意识到这仅在单个 StackPanel 占据整个高度时才有效,如您的图像所示。但也许它会让你走上正轨!

    【讨论】:

    • 我实际上不希望 WrapPanel 垂直增长,否则 StackPanel 不会跳转到下一列。因此,WrapPanel 的高度是固定的。不过你的代码很有趣,谢谢你的回复。我试试看。
    • 该代码有效,可以满足我的需要。有点棘手,因为在调用 Show() 之前不会在 Windows 上设置 Height 属性......但我让它工作了。谢谢。
    猜你喜欢
    • 2012-05-21
    • 2012-07-29
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    • 1970-01-01
    • 2015-08-27
    • 1970-01-01
    • 2013-02-28
    相关资源
    最近更新 更多