WinRT XAML GridView控件中的“粘滞滚动”问题

时间:2012-11-11 14:55:14

标签: gridview padding winrt-xaml horizontal-scrolling sticky

我在Windows应用商店应用页面中定义了一个非常基本的GridView控件,如下所示:

    <GridView
        x:Name="myGridView"
        Grid.RowSpan="2"
        Padding="30,137,40,46"
        ItemsSource="{Binding Source={StaticResource myItemsViewSource}}"
        ItemTemplate="{StaticResource My500x500ItemTemplate}"
        SelectionMode="Multiple"
        IsSwipeEnabled="True"
        IsItemClickEnabled="True">

        <GridView.ItemsPanel>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel Orientation="Horizontal"/>
            </ItemsPanelTemplate>
        </GridView.ItemsPanel>
        <GridView.GroupStyle>
            <GroupStyle>
                <GroupStyle.HeaderTemplate>
                    <DataTemplate>
                        <Grid Margin="1,0,0,6">
                            <Button
                            Style="{StaticResource TextPrimaryButtonStyle}">
                                <StackPanel Orientation="Horizontal">
                                    <TextBlock Text="{Binding Title}" Margin="3,-7,10,10" Style="{StaticResource GroupHeaderTextStyle}" />
                                    <TextBlock Text="{StaticResource ChevronGlyph}" FontFamily="Segoe UI Symbol" Margin="0,-7,0,10" Style="{StaticResource GroupHeaderTextStyle}"/>
                                </StackPanel>
                            </Button>
                        </Grid>
                    </DataTemplate>
                </GroupStyle.HeaderTemplate>
                <GroupStyle.Panel>
                    <ItemsPanelTemplate>
                        <VariableSizedWrapGrid/>
                    </ItemsPanelTemplate>
                </GroupStyle.Panel>
            </GroupStyle>
        </GridView.GroupStyle>
    </GridView>

在运行时,绑定到myItemsViewSource的数据会出现在GridView控件中,如我所料。

但是,当数据源中的项目多于屏幕上显示的项目时,我遇到了一个奇怪的滚动问题。滚动条似乎“抵制”我滚动集合的努力,只是略微移动视口,直到它“自由”并且我可以滚动其余的项目:

demonstration of problem scrolling right

demonstration of smooth scrolling beyond the sticking point

同样的事情发生在返回的路上,从右到左:滚动顺利发生,直到我足够接近滚动区域的开始,它似乎再次“粘住”:

demonstration of problem scrolling left

认为问题与虚拟化有关,我尝试将ItemsPanel的{​​{1}}更改为GridView而不是StackPanel,但这样做了防止任何物品被显示的甚至更糟的效果。注意:VirtualizingStackPanel未托管在任何其他滚动区域或画布中。

我将在下面发布我的解决方法,但我希望有人能得到更满意的答案。

3 个答案:

答案 0 :(得分:3)

您应该删除实际GridView上的左边距和填充,并将其添加到ItemsPanel声明中。有点混乱,因为默认模板确实在gridview上设置了填充。

这是GridView的开始,它带有默认模板,我对GridView控件上的填充进行了编辑,并在VirtualizingStackPanel ItemsPanel声明上设置了边距。

<GridView
        x:Name="itemGridView"
        AutomationProperties.AutomationId="ItemGridView"
        AutomationProperties.Name="Grouped Items"
        Grid.RowSpan="2"
        Padding="0,137,40,46"
        ItemsSource="{Binding Source={StaticResource groupedItemsViewSource}}"
        ItemTemplate="{StaticResource Standard250x250ItemTemplate}"
        SelectionMode="None"
        IsSwipeEnabled="false"
        IsItemClickEnabled="True"
        ItemClick="ItemView_ItemClick">

        <GridView.ItemsPanel>
            <ItemsPanelTemplate>                        
                <VirtualizingStackPanel Margin="116,0,0,0" Orientation="Horizontal"/>
            </ItemsPanelTemplate>
        </GridView.ItemsPanel>

答案 1 :(得分:0)

删除GridView.Padding属性并将其替换为GridView.Margin解决了“粘性滚动”问题:

    <GridView
        x:Name="myGridView"
        Grid.RowSpan="2"
        Margin="30,137,40,46" <!-- replaced 'Padding' with 'Margin' -->
        ItemsSource="{Binding Source={StaticResource myItemsViewSource}}"
        ItemTemplate="{StaticResource My500x500ItemTemplate}"

        ...

然而,这令我感到困惑,因为Visual Studio GridView项目模板使用Padding,而不是Margin。

有人知道更令人满意的解决方案吗?

编辑:删除了误导性陈述。

答案 2 :(得分:0)

问题是

<VirtualizingStackPanel Margin="116,0,0,0" Orientation="Horizontal"/>

将其更改为:<StackPanel Margin="116,0,0,0" Orientation="Horizontal"/>