【问题标题】:ISupportIncrementalLoading GridView within a ScrollViewer fires LoadMoreItemsAsync continuouslyISupportIncrementalLoading ScrollViewer 中的 GridView 会连续触发 LoadMoreItemsAsync
【发布时间】:2016-10-18 04:27:01
【问题描述】:

我使用 ISupportIncrementalLoading 集合将一些大型数据集绑定到我的应用程序中的多个 GridView。当 GridView 控件提供滚动时,它们工作得非常好。

但是,在我的一个页面上,我在 GridView 上方有一些内容,我想成为滚动的一部分。

这是 XAML:

<ScrollViewer x:Name="RootScroller" VerticalScrollMode="Enabled" HorizontalScrollMode="Disabled" VerticalScrollBarVisibility="Auto">
  <Grid>
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
    </Grid.RowDefinitions>
    <Grid Grid.Row="0">
        <!--static content here--> 
    </Grid>        
    <GridView Grid.Row="1"
        ItemsSource="{Binding Items}" 
        ScrollViewer.HorizontalScrollMode="Disabled" ScrollViewer.VerticalScrollMode="Disabled">                    
    </GridView>
  </Grid>
</ScrollViewer>

加载页面时,LoadMoreItemsAsync 会一次又一次地触发。我知道当 GridView 位于 StackPanel 内部时也会发生同样的问题,因为 GridView 永远不会获得正确的高度。也许我的布局导致了同样的问题?关于如何让动态加载在这种情况下工作有什么想法吗?

【问题讨论】:

    标签: uwp uwp-xaml


    【解决方案1】:

    我知道当 GridView 位于 StackPanel 内部时会发生这种情况,因为 GridView 永远不会得到正确的高度。也许我的布局导致了同样的问题?

    没有。如您所知,如果您将GridView 放入StackPanel 中,GridView 将永远无法获得正确的高度。会导致GridView不按this thread滚动。

    这是因为堆栈面板的高度是无限的。由于高度和宽度基本上由容器继承,滚动查看器永远没有理由滚动,因为它已经允许增长到无限大小。

    但是对于您的场景,ScollerViewer 可以很好地工作。我测试了你的代码,ScrollerView可以工作但数据无法获取虚拟化,加载GridView时会加载所有数据。

    加载页面时,LoadMoreItemsAsync 会一遍又一遍地触发。

    如果您在 ScrollViewer 内有一个 GridView ,则 LoadMoreItemsAsync 将一遍又一遍地触发,直到数据加载完成。 ScrollerViewer 击败了虚拟化。具体原因请看UI virtualization的描述。

    一些面板允许子元素无限空间,例如 ScrollViewer 和 Grid,具有自动调整大小的行或列。当一个虚拟化的 ItemsControl 被放置在这样的面板中时,它需要足够的空间来显示它的所有项目,这会破坏虚拟化。通过在 ItemsControl 上设置宽度和高度来恢复虚拟化。

    根据文章,您的解决方案很简单,通过为GridView 设置高度来恢复虚拟化。设置高度后你会发现另一个问题,GridView上方的内容不能与GridView一起滚动,因为它与GridView在不同的行。您需要将它们放在同一个容器中。这是我建议的示例代码,你可以测试一下。

    <ScrollViewer
        x:Name="RootScroller"
        HorizontalScrollMode="Disabled"
        VerticalScrollBarVisibility="Auto"
        VerticalScrollMode="Enabled">
        <StackPanel>
            <TextBlock x:Name="tbCollectionChangeStatus" />
            <ListView x:Name="lvEmployees" Height="800">
               ...
            </ListView>
        </StackPanel>
    </ScrollViewer>
    

    您也可以在后面的代码中设置高度。

    【讨论】:

    • 我已经用你的 XAML 设置了我的页面,但它不适合我。如果您的示例中的 ListView 处于固定高度,我看不到它如何通过 RootScroller 滚动。该示例只是导致 ListView 内容被截断,无法滚动。
    • @Scott,我上传了一个最小化demo 你可以做进一步的测试。实际上,在这种情况下我们有两个滚动查看器,一个在外部用于滚动“内容”和 ListView,一个在 ListView 内部用于滚动虚拟化数据。我们不能将“静态内容”放在 ListView 中进行滚动。我们可以在static content 和 ListView 之间滚动。所以如果 'content' 和 'ListView' 的高度小于应用程序视图,你将看不到该栏。深入理解我上面提到的概念可以帮助你更多。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多