C# 具有gridview的wpf mvp listview渲染时间长

C# 具有gridview的wpf mvp listview渲染时间长,c#,wpf,listview,gridview,mvp,C#,Wpf,Listview,Gridview,Mvp,我有一个用户控件,它有一个带有gridview的listview。 我正在使用后台工作程序开始加载动画,获取数据并停止加载动画。一切都很好,但问题是在我获得数据并将其绑定到网格后,渲染网格需要很长时间,加载动画在这段时间内冻结 BackgroundWorker bw = new BackgroundWorker() { WorkerReportsProgress = true }; public FormUserControl() { InitializeC

我有一个用户控件,它有一个带有gridview的listview。 我正在使用后台工作程序开始加载动画,获取数据并停止加载动画。一切都很好,但问题是在我获得数据并将其绑定到网格后,渲染网格需要很长时间,加载动画在这段时间内冻结

BackgroundWorker bw = new BackgroundWorker() { WorkerReportsProgress = true };



    public FormUserControl()
    {
        InitializeComponent();
        presenter = new FormPresenter(this);
        bw.DoWork += new DoWorkEventHandler(LoadInfo);
        bw.RunWorkerCompleted += LoadInfo_RunWorkerCompleted;



        Dispatcher.Invoke(new Action(() =>
        {
            EnableLoading(true);

        }), DispatcherPriority.ContextIdle);

        bw.RunWorkerAsync();

    }

    void LoadInfo(object sender, DoWorkEventArgs e)
    {
        presenter.LoadFormInformation();
    }

    private void LoadInfo_RunWorkerCompleted(object sender,RunWorkerCompletedEventArgs e)
    {
        Dispatcher.Invoke(new Action(() =>
        {
            //here animation freezes 
            this.AjmStoreLog = this.GridInfo;
            EnableLoading(false);

        }), DispatcherPriority.ContextIdle);
    }
我需要调用EnableLoading(false);此函数用于在LoadInfo\u RunWorkerCompleted事件中网格渲染未完成时执行


谢谢大家的帮助。

在很多情况下,性能会因为要做的工作太多而受到影响,而且很多工作都必须在UI线程上进行。如果您的数据源中有许多项,或者如果您的模板非常复杂,那么没有什么灵丹妙药解决方案可以提供帮助


我建议先看看UI虚拟化,假设有很多项,这是性能问题的主要原因。在没有UI虚拟化的情况下,列表控件需要呈现数据源中的每个项目,但启用它将使其只需要在屏幕上实际呈现可见的项目,这将产生巨大的差异。

谢谢,我知道没有一种神奇的方法可以做到这一点,因为我读到的listview已经虚拟化了,所以我还没有运气。如果我能找到一个答案,我会在这里回答。然后我建议在剖析器下运行,收集更多关于实际花费时间最长的信息;这可能会给你一些线索,告诉你可以优化什么。探查器通常会告诉您什么是对性能影响最大的“热路径”。亲爱的Alex,我在使用gridview的wpf listview中阅读了有关UI虚拟化的主题,相应地编辑了我的代码并运行探查器。我可以看到,即使listview面板正确地进行了虚拟化(并没有破坏虚拟化),但将数据加载到网格中仍然需要大量时间。从这里可以看到。我可以在4秒内加载网格面板,但我认为我需要的是在实际网格渲染完成时触发一个事件,以避免过早结束加载动画现在我正在使用后台工作程序和调度程序开始加载动画,获取数据并结束加载动画,但这会导致加载动画在数据准备就绪并绑定到网格时结束。我认为我需要的是,当网格的实际渲染完成时,我需要结束加载动画。是否为此引发了一个事件,我不知道它是否真的可能。我认为渲染和数据绑定之间没有区别。WPF列表控件的工作方式是在绑定数据时,控件为每个项创建UI容器,并将它们添加到控件的可视化树中;这只能在UI线程上发生。从你的屏幕截图上看,似乎每个项目都有一个复杂的模板,即使是几毫秒对我来说也是很多。我认为没有办法将所有这些转移到另一个线程,因此您需要考虑简化项模板,或者使其异步初始化。