C# 如何在WrapPanel中将VerticalContentAlignment设置为top?

C# 如何在WrapPanel中将VerticalContentAlignment设置为top?,c#,wpf,wrappanel,C#,Wpf,Wrappanel,我有一个垂直对齐的包装 我的问题是,每当元素溢出时,它就会转到下一列。因此,第一列中的项目将均匀地垂直对齐 示例:假设包装袋的高度为170px,包装袋的项目高度为35px。因此,它将显示第一列中的前4个元素,这些元素将均匀分布。其余项目将转移到下一列,依此类推。在170px高度中,我希望这些项目使用它们所需的高度,并保留额外的空间。所以在140px之后,我应该得到30px的空闲空间 我没有从WrapPanel的属性中得到任何方法来实现这一点,因为它只有很少的属性来支持其项目的布局和样式 如何做到

我有一个垂直对齐的包装

我的问题是,每当元素溢出时,它就会转到下一列。因此,第一列中的项目将均匀地垂直对齐

示例:假设包装袋的高度为170px,包装袋的项目高度为35px。因此,它将显示第一列中的前4个元素,这些元素将均匀分布。其余项目将转移到下一列,依此类推。在170px高度中,我希望这些项目使用它们所需的高度,并保留额外的空间。所以在140px之后,我应该得到30px的空闲空间

我没有从WrapPanel的属性中得到任何方法来实现这一点,因为它只有很少的属性来支持其项目的布局和样式


如何做到这一点?

下面是一个使用UniformGrid的示例,它可能接近您想要实现的目标

XAML

<Grid>
    <ListBox ItemsSource="{Binding GridItemsList}" >
        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <UniformGrid Rows="2" Columns="4" FlowDirection="RightToLeft" />
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <TextBlock Text="{Binding ItemName}" />
                    <StackPanel.LayoutTransform>
                        <RotateTransform Angle="-90"/>
                    </StackPanel.LayoutTransform>
                </StackPanel>

            </DataTemplate>
        </ListBox.ItemTemplate>
        <ListBox.LayoutTransform>
            <RotateTransform Angle="-90"/>
        </ListBox.LayoutTransform>
    </ListBox>
</Grid>

代码隐藏

public partial class UniformGridWindow : Window {
    public UniformGridWindow() {

        //Sample Data
        GridItemsList = new List<GridItem> {
            new GridItem("Item 1"),
            new GridItem("Item 2"),
            new GridItem("Item 3"),
            new GridItem("Item 4"),
            new GridItem("Item 5"),
            new GridItem("Item 6"),
            new GridItem("Item 7"),
            new GridItem("Item 8")
        };

        InitializeComponent();
        this.DataContext = this;
    }

    public List<GridItem> GridItemsList { get; set; }

}

public class GridItem {
    public string ItemName { get; set; }
    public GridItem(string itemName) {
        this.ItemName = itemName;
    }
}
public分部类UniformGridWindow:Window{
公共UniformGridWindow(){
//样本数据
GridItemsList=新列表{
新项目(“项目1”),
新项目(“项目2”),
新项目(“项目3”),
新项目(“项目4”),
新项目(“项目5”),
新项目(“项目6”),
新项目(“项目7”),
新项目(“项目8”)
};
初始化组件();
this.DataContext=this;
}
公共列表GridItemsList{get;set;}
}
公共类GridItem{
公共字符串ItemName{get;set;}
公共GridItem(字符串itemName){
this.ItemName=ItemName;
}
}

下面是一个使用UniformGrid的示例,它可能接近您想要实现的目标

XAML

<Grid>
    <ListBox ItemsSource="{Binding GridItemsList}" >
        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <UniformGrid Rows="2" Columns="4" FlowDirection="RightToLeft" />
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <StackPanel>
                    <TextBlock Text="{Binding ItemName}" />
                    <StackPanel.LayoutTransform>
                        <RotateTransform Angle="-90"/>
                    </StackPanel.LayoutTransform>
                </StackPanel>

            </DataTemplate>
        </ListBox.ItemTemplate>
        <ListBox.LayoutTransform>
            <RotateTransform Angle="-90"/>
        </ListBox.LayoutTransform>
    </ListBox>
</Grid>

代码隐藏

public partial class UniformGridWindow : Window {
    public UniformGridWindow() {

        //Sample Data
        GridItemsList = new List<GridItem> {
            new GridItem("Item 1"),
            new GridItem("Item 2"),
            new GridItem("Item 3"),
            new GridItem("Item 4"),
            new GridItem("Item 5"),
            new GridItem("Item 6"),
            new GridItem("Item 7"),
            new GridItem("Item 8")
        };

        InitializeComponent();
        this.DataContext = this;
    }

    public List<GridItem> GridItemsList { get; set; }

}

public class GridItem {
    public string ItemName { get; set; }
    public GridItem(string itemName) {
        this.ItemName = itemName;
    }
}
public分部类UniformGridWindow:Window{
公共UniformGridWindow(){
//样本数据
GridItemsList=新列表{
新项目(“项目1”),
新项目(“项目2”),
新项目(“项目3”),
新项目(“项目4”),
新项目(“项目5”),
新项目(“项目6”),
新项目(“项目7”),
新项目(“项目8”)
};
初始化组件();
this.DataContext=this;
}
公共列表GridItemsList{get;set;}
}
公共类GridItem{
公共字符串ItemName{get;set;}
公共GridItem(字符串itemName){
this.ItemName=ItemName;
}
}

您可以使用VariableSizedWrapGrid,就像Contoso Cookbook Windows 8示例中的一样。在那里声明MaximumRowsOrColumns,它会将您的项目包装到另一列(或行)上



这就是您想要的吗?

您可以使用VariableSizedWrapGrid,就像Contoso Cookbook Windows 8示例中的一样。在那里声明MaximumRowsOrColumns,它会将您的项目包装到另一列(或行)上



这就是您想要的吗?

如果您必须以统一的行数和列数显示项目,那么UniformGrid允许您这样做。例如,每行可以有4个元素,然后下4个元素将占据下一行,依此类推。我唯一不确定的是,你不想先填写这一列,然后再转到下一列。为此,我认为LayoutTransform应该可以工作。如果您必须以统一的行数和列数显示项目,那么UniformGrid允许您这样做。例如,每行可以有4个元素,然后下4个元素将占据下一行,依此类推。我唯一不确定的是,你不想先填写这一列,然后再转到下一列。为此,我认为布局转换应该有效。