【问题标题】:Which event fires after all items are loaded and shown in a ListView?加载所有项目并在 ListView 中显示后会触发哪个事件?
【发布时间】:2015-01-01 10:16:24
【问题描述】:

在所有项目都加载并显示在 WPF ListView 中后会触发哪个事件? 我尝试优化在 ListView 中显示大量项目。 ListView 使用以下代码填充项目:

List<Artist> selectedArtistsList;
//Code to fill selectedArtistsList with about 6,000 items not shown here
CollectionViewSource selection1ViewSource = ((CollectionViewSource)(this.FindResource("selection1Source")));
Stopwatch stopWatch1 = new Stopwatch();
stopWatch1.Start();
selection1ViewSource.Source = selectedArtistsList;
stopWatch1.Stop();
Debug.Print("Time used: {0}ms", stopWatch1.ElapsedMilliseconds.ToString());

当我运行此代码时,我看到“使用时间 119 毫秒”或类似内容。但是在我在屏幕上看到 ListView 中的项目之前,还需要大约 3 秒。 是否有在 ListView 加载项目后触发的事件? 我有兴趣衡量 ListView 何时为用户准备就绪。

【问题讨论】:

  • 试试listView.ItemContainerGenerator.ItemsChanged。 WPF 在单独的线程上渲染,因此如果您想在渲染完成后运行代码,您可以尝试 Dispatcher.Invoke 优先级
  • 如果这需要 3 秒,那么您可能没有进行虚拟化。发布您的 XAML。
  • 谢谢@Blam,我会检查虚拟化。现在,在我知道如何准确检查显示我的列表需要多长时间之后,我可以更轻松地比较改进代码的不同方法。

标签: c# .net wpf listview events


【解决方案1】:

感谢您的 cmets。我找到了解决方案。 在尼克贝克发表评论后,我用谷歌搜索了 Dispatcher.Invoke。经过阅读和测试,我发现了这个页面

WPF:窗口渲染完成时运行代码 http://geekswithblogs.net/ilich/archive/2012/10/16/running-code-when-windows-rendering-is-completed.aspx

然后我将代码更改为以下(不是完整的代码,只是相关部分):

private void Work(){
    List<Artist> selectedArtistsList;
    //Code to fill selectedArtistsList with about 6,000 items not shown here
    CollectionViewSource selection1ViewSource = ((CollectionViewSource)(this.FindResource("selection1Source")));
    stopWatch1.Reset();
    stopWatch1.Start();
    selection1ViewSource.Source = selectedArtistsList;
    Debug.Print("After setting Source: {0}ms", stopWatch1.ElapsedMilliseconds.ToString());

    //New:
    Dispatcher.BeginInvoke(new Action(RenderingDone), System.Windows.Threading.DispatcherPriority.ContextIdle, null);
}

//New
Stopwatch stopWatch1 = new Stopwatch();
private void RenderingDone() {
    Debug.Print("After rendering is done: {0}ms", stopWatch1.ElapsedMilliseconds.ToString());
}

运行后我看到: 设置源后:124ms 渲染完成后:2273ms

渲染完成后出现最后一行,它显示了正确的时间。这正是我想要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-28
    • 1970-01-01
    • 2011-11-22
    相关资源
    最近更新 更多