【问题标题】:"Sticky scrolling" issue in WinRT XAML GridView controlWinRT XAML GridView 控件中的“粘滞滚动”问题
【发布时间】:2026-02-10 20:35:01
【问题描述】:

我在 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 控件中。

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

同样的事情发生在从右到左的路上:滚动顺利进行,直到我足够接近滚动区域的起点,它似乎又“粘”在了哪里:

考虑到问题与虚拟化有关,我尝试将 GridViewItemsPanel 更改为 StackPanel 而不是 VirtualizingStackPanel,但这会产生更糟糕的效果,阻止任何从被显示的项目。注意:GridView 未托管在任何其他滚动区域或画布中。

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

【问题讨论】:

  • 我遇到了同样的问题。我认为问题出在计算错误的内部项目模板上。事实上,滚动条不仅具有粘性,而且还可以一寸一寸地调整大小。

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


【解决方案1】:

您应该删除实际 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>

【讨论】:

  • 谢谢,这完成了同样的事情,不影响滚动条的偏移量。
  • 如果您可以使用支持触摸的设备(Win8 平板电脑或像我这样的联想 ThinkPad x230t)进行测试,可滚动区域是不同的(使用鼠标滚动可以实现更大的宽度...?)。此外,当用户用触摸将GridView 滑动到最右侧时,GridView 会有些颤抖。
【解决方案2】:

删除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。

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

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

【讨论】:

  • 从填充更改为边距也会移动底部滚动条的位置。有没有办法防止滚动条移动?
【解决方案3】:

问题是

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

将其更改为:&lt;StackPanel Margin="116,0,0,0" Orientation="Horizontal"/&gt;

【讨论】:

  • 你会失去虚拟化:-)。是的,这是 a 解决方案,但如果您想保留性能,则不是解决方案。核心问题实际上是场景中的已知问题,已在 Windows 8.1 中修复