【问题标题】:Windows 8.1 how to automatically wrap grid items?Windows 8.1 如何自动换行网格项?
【发布时间】:2014-09-20 20:36:28
【问题描述】:

我正在构建一个通用应用程序,而我的 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 都试过了(到底有什么区别?)和ListViewGridView。没有区别。

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

【问题讨论】:

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


    【解决方案1】:

    您不需要做任何事情。它应该根据可用的客户区进行包装。我能想到的唯一不会让它换行的是你把你的&lt;GridView&gt; 放在一个固定宽度的容器中 或者一个大小为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 种不同的尺寸

    【讨论】:

    • 这很奇怪。树看起来像这样:Page -> Grid -> GridView。它所在的 Grid 列的宽度为 Auto。没有固定的宽度。不过,当我缩小窗户时,它看起来像这样:i.imgur.com/huNUA6Q.png.
    • 嗯,找到问题了。这是因为我将 wrapgrid 放在 1 列中,其中我有 3 列(所以 wrapgrid 的每一侧都有一个额外的列。在我将 columnspan 设置为 3 后,它开始像它应该的那样换行。如果你可以更新你的答案以包括这个我会接受的:)
    • Sweet :) Auto 大小将与固定大小具有相同的效果。网格只会计算一次大小......除非集合如果绑定更改。所以调整应用程序的大小不会影响它。将您的Auto 更改为*,您可以调整您的应用程序的大小,它会更改环绕网格。 :),我将更新解决方案以避免 Auto 为好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-28
    相关资源
    最近更新 更多