【发布时间】:2016-03-02 08:17:09
【问题描述】:
为了简化示例,假设我们只是在页面中添加了一个 GridView:
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<GridView x:Name="MainGrid" />
</Grid>
这是代码:
public MainPage()
{
this.InitializeComponent();
this.Loaded += MainPage_Loaded;
}
private async void MainPage_Loaded(object sender, RoutedEventArgs e)
{
var collection = new ObservableCollection<String>();
MainGrid.ItemsSource = collection;
await Dispatcher.RunIdleAsync(test =>
{
for (int i = 0; i < 20000; i++)
{
collection.Add(i.ToString());
}
});
}
GridView 充满了 ObservableCollection,我不抱怨滚动,而是抱怨调整窗口大小和最大化窗口会造成巨大的延迟,在低规格计算机中甚至更糟。
我做了以下改进:
- 使用 IncrementalLoadingThreshold 和 DataFetchSize 的值
<GridView x:Name="MainGrid" IncrementalLoadingThreshold="100" DataFetchSize="3"/>
有时会更好,但不确定此值是否适用于静态集合。
- 将对齐方式更改为顶部和左侧以跟踪 SizeChanged 并适应网格。
这会更好,但是当我点击最大化时它有很大的延迟。
我也尝试过像http://xurxodeveloper.blogspot.com.es/2014/03/scroll-infinito-en-windows-81-con-xaml.html 这样的旧示例,但是当滚动到最后时它不会添加更多项目。而且我找到的性能提示和文章只是为了滚动。
那么在这种静态情况下,是否有一种技术或其他收集源来改善调整大小的延迟?
【问题讨论】:
-
附注:没有必要在调度程序的最后一行运行 - 从
await Task...返回后,它已经在捕获的 UI 上下文中运行。第二 - 不要在 non-UI 线程中修改 ObservableCollection(与 UI 控件一起使用) - 你会得到异常 - 你的情况是有效的,因为在集合被设置为 UI 元素的 itemssource 之后满了,如果你交换订单,它不会工作。但正如我所提到的,这些是与您的问题无关的旁注。 -
好吧,我开始从测试中删除代码,我已经更新了代码,我认为现在更干净了,谢谢你的帮助,关于另一个可以更好地工作的集合有什么想法吗?
-
ObservableCollection 似乎是一个不错的选择——它被设计用于在这种情况下使用 UI 元素。我不知道如何让它更好地工作,我会尝试使用 GridView's (ListView's) IncrementalLoading 搜索一些东西 - 不要加载不需要时的所有项目 - 可能尝试搜索有关 ListView 和增量装货、方法 LoadMoreItemsAsync 等的内容。虽然我不确定这对你的情况如何。
标签: xaml gridview windows-10 win-universal-app