2017-05-04 62 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