在WPF中指定WrapPanel的最大列数

我有一个WrapPanel,我想指定其列的最大数量。 因此,例如,当我的Collection“ObjectCollection”(绑定到此WrapPanel)仅包含4个元素时,WrapPanel将只有一行。 但是,当“ObjectCollection”将有5个元素时,wrapPanel将创建另一行来放置第五个元素。 (在这种情况下,我的Max_Columns_Number为4)。

我很确定你不能使用WrapPanel ,但你可以使用UniformGrid 。

该属性具有指定所需行数和列数的属性。

如果将Columns属性设置为4,它将在每行中保留4个项目,然后换行到下一个。

          

基本上你需要为自己创建一个自定义Panel ……现在不要感到沮丧……这并不困难。 首先,请查看我提供链接的post,了解如何创建自定义Panel

如何在WPF中创建自定义布局面板

在WPF中创建自定义面板

好了,现在您已经了解了有关创建自定义Panel的更多信息,我们可以继续……这就是您需要的:

 private int columnCount; private double leftColumnEdge, rightColumnEdge, columnWidth; public int ColumnCount { get { return columnCount; } set { if (value < 1) value = 1; columnCount = value; } } 

Resources声明Panel ,将使用此属性:

    

请注意,您需要 ItemsPanelTemplate对象中声明它,因为这是ItemsPanel属性所期望的:

   

现在回到Panel ...这是一个帮助方法,我从MeasureOverrideArrangeOverride方法调用:

 private void UpdateColumns(int currentColumn, Size finalSize) { leftColumnEdge = (finalSize.Width / ColumnCount) * currentColumn; rightColumnEdge = (finalSize.Width / ColumnCount) * (currentColumn + 1); columnWidth = rightColumnEdge - leftColumnEdge; } 

不幸的是,我无法为您提供完整的示例,因为我的自定义Panel都绑定到一个具有许多附加function的基础AnimatedPanel类。 但是,您只需创建MeasureOverrideArrangeOverride方法即可完成此Panel 。 如果你只是从逻辑上思考它,那真的不是那么困难。

有时UniformGrid是不够的:

  • 当物品的尺寸大小不同时,或者
  • 当您想要垂直项目并且不想使用其他解决方法时

在这个stackoverflowpost中可以找到一个WrapPanel,其中包含您要搜索的内容。

XAML:

          

结果:

在此处输入图像描述

您可以通过设置包装面板的宽度来控制列数。 我将包裹面板的宽度绑定到像Border这样的容器的ActualWidth。 这样,列数是动态的,并且基于窗口的宽度。