在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
...这是一个帮助方法,我从MeasureOverride
和ArrangeOverride
方法调用:
private void UpdateColumns(int currentColumn, Size finalSize) { leftColumnEdge = (finalSize.Width / ColumnCount) * currentColumn; rightColumnEdge = (finalSize.Width / ColumnCount) * (currentColumn + 1); columnWidth = rightColumnEdge - leftColumnEdge; }
不幸的是,我无法为您提供完整的示例,因为我的自定义Panel
都绑定到一个具有许多附加function的基础AnimatedPanel
类。 但是,您只需创建MeasureOverride
和ArrangeOverride
方法即可完成此Panel
。 如果你只是从逻辑上思考它,那真的不是那么困难。
有时UniformGrid是不够的:
- 当物品的尺寸大小不同时,或者
- 当您想要垂直项目并且不想使用其他解决方法时
在这个stackoverflowpost中可以找到一个WrapPanel,其中包含您要搜索的内容。
XAML:
结果:
您可以通过设置包装面板的宽度来控制列数。 我将包裹面板的宽度绑定到像Border这样的容器的ActualWidth。 这样,列数是动态的,并且基于窗口的宽度。