ScuViewer中的ISupportIncrementalLoading GridView连续触发LoadMoreItemsAsync

时间:2016-10-14 21:37:42

标签: uwp uwp-xaml

我已经使用ISupportIncrementalLoading集合将一些大型数据集绑定到我的应用程序中的几个GridViews。当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永远不会达到合适的高度。也许我的布局导致了同样的问题?关于如何在这种情况下使动态加载工作的任何想法?

1 个答案:

答案 0 :(得分:0)

  

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

没有。如果您在GridView内放置StackPanelGridView永远不会达到正确的高度。它将导致GridView根据this thread不滚动。

  

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

但是对于您的方案,ScollerViewer可以正常运行。我测试了您的代码,ScrollerView可以正常工作但数据无法获取虚拟化,它会在加载GridView时加载所有数据。

  

加载页面时,会反复触发LoadMoreItemsAsync。

如果GridViewScrollViewerLoadMoreItemsAsync将被反复触发,直到数据加载完成。 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>

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