Windows 8.1如何自动换行网格项?

时间:2014-09-20 20:36:29

标签: xaml grid windows-runtime winrt-xaml windows-8.1

我正在构建一个通用应用程序,我的Win8.1应用程序必须显示一个项目网格。通常情况下,网格由3列组成,但在较小的屏幕上,我希望项目包装,以便只有2列(甚至1列)。这是我的代码:

<GridView ItemsSource="{Binding Regions}" IsItemClickEnabled="True">
    <GridView.ItemsPanel>
        <ItemsPanelTemplate>
            <ItemsWrapGrid Orientation="Horizontal" MaximumRowsOrColumns="3" MinWidth="400" />
        </ItemsPanelTemplate>
    </GridView.ItemsPanel>
    <GridView.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal" Margin="10">
                <Image Source="{Binding Code, Converter={StaticResource FlagIconConverter}, ConverterParameter='/Assets/Icons/Flags/{0}.png'}" Width="30" />
                <TextBlock Text="{Binding NativeName}" Style="{StaticResource BodyTextBlockStyle}" Margin="10,0,0,10" VerticalAlignment="Center" />
            </StackPanel>
        </DataTemplate>
    </GridView.ItemTemplate>
</GridView>

每当我缩小应用程序时,项目都不会自动换行。我尝试通过使用MaximumRowsOrColumns更改VisualStateManager属性来解决此问题,但由于某些原因无法访问WrapGrid,因此无效。从代码隐藏中更改属性也不起作用,因为它再次无法访问WrapGrid。

我用WrapGridItemsWrapGrid(无论如何有什么区别?)和ListView以及GridView尝试了这个。没有区别。

有谁知道如何做到这一点?

1 个答案:

答案 0 :(得分:5)

你不需要做任何事情。它应该根据可用的客户区域进行换行。我唯一能想到的就是将你的<GridView> 放在一个固定宽度的容器或一个大小为Auto的容器中不更新Observable Collection以通知Grid重绘/更新自己。

例如,这不会换行。

<Grid Width="1000">
    <GridView x:Name="myGridView" IsItemClickEnabled="True">
        <GridView.ItemsPanel>
            <ItemsPanelTemplate>
                <ItemsWrapGrid Orientation="Horizontal" MaximumRowsOrColumns="5"/>
            </ItemsPanelTemplate>
        </GridView.ItemsPanel>
        <GridView.ItemTemplate>
            <!-- DATATEMPLATE -->
        </GridView.ItemTemplate>
     </GridView>
</Grid>

然而,摆脱Width=1000,它将包裹。

示例输出3种不同的尺寸

enter image description here