我已经使用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永远不会达到合适的高度。也许我的布局导致了同样的问题?关于如何在这种情况下使动态加载工作的任何想法?
答案 0 :(得分:0)
我知道当GridView位于StackPanel内部时会发生这种情况,因为GridView永远不会达到合适的高度。也许我的布局导致了同样的问题?
没有。如果您在GridView
内放置StackPanel
,GridView
永远不会达到正确的高度。它将导致GridView
根据this thread不滚动。
这是因为堆叠面板的高度是无限的。由于高度和宽度基本上是由容器继承的,因此滚动查看器永远不会有滚动的理由,因为它已经允许增长到无限大小。
但是对于您的方案,ScollerViewer
可以正常运行。我测试了您的代码,ScrollerView
可以正常工作但数据无法获取虚拟化,它会在加载GridView
时加载所有数据。
加载页面时,会反复触发LoadMoreItemsAsync。
如果GridView
内ScrollViewer
,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>
您也可以在后面的代码中设置高度。