2017-05-04 50 views
0

我有一个用户控件,有一个列表视图与gridview。 我正在使用后台工作开始加载动画,获取数据并停止加载动画。一切都很好,但问题出在我获取数据并将其绑定到网格之后,在此期间渲染网格和加载动画需要很长时间。wpf mvp listview与gridview长渲染时间

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_RunWorkerCompleted事件中。

感谢您的帮助。

回答

1

有很多情况下,性能会受到影响,因为要做的工作太多,而且很多工作都必须在UI线程上发生。没有魔术弹头解决方案可以帮助 - 如果你的数据源中有很多项目,或者你的模板非常复杂...

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

+0

谢谢我知道有没有一种神奇的方式来做到这一点,据我所知,listview已经被虚拟化了,所以没有运气给我。我会在这里回答,如果我能找到一个 – bugrasitemkar

+0

然后,我建议在探查器下运行,并收集更多有关实际采取时间最长的信息;这可以为您提供可以优化的线索。 Profiler通常会告诉你什么是最能伤害性能的“热门路径”。 –

+0

亲爱的Alex,我阅读了关于使用gridview在wpf listview中进行UI虚拟化的主题,相应地编辑了我的代码并运行了一个分析器。我可以看到,即使listview面板正确虚拟化(没有杀死虚拟化),仍然需要大量时间将数据加载到网格。从这里可以看到https://imagebin.ca/v/3LPVTQ9sjn1o。我可以在4秒内加载网格面板,但我相信我需要的是在实际网格渲染完成时触发一个事件,以避免过早加载动画 – bugrasitemkar