Gridview项目动态宽度根据UWP中的屏幕大小

时间:2016-12-14 09:53:38

标签: xaml gridview uwp windows-10 visualstatemanager

我创建了一个GridView,它通过数据绑定获取数据。我接下来要做的是根据屏幕尺寸使GridView项目宽度动态化(就像他们在Windows 10新闻,体育应用程序等中所做的那样)到目前为止,我已经完成了它通过将水平对齐设置为拉伸,使用可视状态管理器成功获得最小窗口宽度0,但是我无法继续将其用于其他更宽的窗口大小。

任何有助于整理出来的帮助都将受到赞赏。

1 个答案:

答案 0 :(得分:4)

如果您希望项目伸展以填充水平空间并且能够指定您想要的每行项目数,那么您必须手动设置ItemsWrapGrid的ItemWidth在GridView的SizeChanged事件中。

以下是一个例子:

<GridView x:Name="gridView" SizeChanged="onGridViewSizeChanged">
    <GridView.ItemTemplate>
        <DataTemplate>
            <Grid Background="GreenYellow" BorderBrush="Black" BorderThickness="2">
                <TextBlock Text="{Binding}" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="40"/>
            </Grid>
        </DataTemplate>
    </GridView.ItemTemplate>

    <GridView.ItemContainerStyle>
        <Style TargetType="GridViewItem">
            <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
            <Setter Property="VerticalContentAlignment" Value="Stretch"/>
            <Setter Property="Margin" Value="0"/>
        </Style>
    </GridView.ItemContainerStyle>

    <GridView.ItemsPanel>
        <ItemsPanelTemplate>
            <ItemsWrapGrid Orientation="Horizontal"/>
        </ItemsPanelTemplate>
    </GridView.ItemsPanel>

    <x:String>1</x:String>
    <x:String>2</x:String>
    <x:String>3</x:String>
    <x:String>4</x:String>
    <x:String>5</x:String>
    <x:String>6</x:String>
    <x:String>7</x:String>
    <x:String>8</x:String>
</GridView>
private void onGridViewSizeChanged(object sender, SizeChangedEventArgs e)
{
    // Here I'm calculating the number of columns I want based on
    // the width of the page
    var columns = Math.Ceiling(ActualWidth / 300);
    ((ItemsWrapGrid)gridView.ItemsPanelRoot).ItemWidth = e.NewSize.Width / columns;
}

Screenshot

您可以将其捆绑到行为或附加属性中。