在WPF中指定WrapPanel的最大列数

NTi*_*cht 17 c# data-binding wpf wrappanel

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

Pet*_*sen 39

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

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

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

<UniformGrid Columns="4">
    <!-- In first row -->
    <Button Content="test"></Button>
    <Button Content="test"></Button>
    <Button Content="test"></Button>
    <Button Content="test"></Button>

    <!-- In second row -->
    <Button Content="test"></Button>
</UniformGrid>
Run Code Online (Sandbox Code Playgroud)


She*_*dan 7

基本上,你将需要创建一个自定义Panel留给自己......现在不要沮丧......这不是困难.首先,请查看我提供链接的帖子,了解如何创建自定义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;
    }
}
Run Code Online (Sandbox Code Playgroud)

您声明Panel进入的地方将使用此属性Resources:

<ItemsPanelTemplate x:Key="AnimatedPanel">
    <Controls:AnimatedColumnWrapPanel ColumnCount="3" ... />
</ItemsPanelTemplate>
Run Code Online (Sandbox Code Playgroud)

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

 <ListBox ItemsPanel="{StaticResource AnimatedPanel}" ... />
Run Code Online (Sandbox Code Playgroud)

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

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

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