公司內部一個項目是用WPF作為GUI 訪問web介面的形式獲取數據, 但是由於數據量比較大,也沒做分頁,於是就需要一個loading的控制項,網上查了很多資料但都比較淺。這裡完成需求後,總結一下。 首先。loading控制項的實現基本上都是1.控制項顯示;2.後臺訪問查詢;3.UI渲染;4.控制項隱藏。 想 ...
公司內部一個項目是用WPF作為GUI 訪問web介面的形式獲取數據,
但是由於數據量比較大,也沒做分頁,於是就需要一個loading的控制項,網上查了很多資料但都比較淺。這裡完成需求後,總結一下。
首先。loading控制項的實現基本上都是1.控制項顯示;2.後臺訪問查詢;3.UI渲染;4.控制項隱藏。
想要實現這部分,需要做到非同步,這裡使用BackgroundWorker 組件用來執行諸如資料庫事務、文件下載等耗時的非同步操作。
關於backgroundWorker這裡不做過多的記錄,已經有很多人進行了系統的用法歸類,這裡僅僅使用其以下方法:
1.BackgroundWorker bgMeet = new BackgroundWorker(); //創建對象
2.bgMeet.WorkerReportsProgress = true; //為了顯示後臺操作的執行進度,一般使用進度條時可以用其配套的ReportProgress()方法,通過它傳遞操作完成的進度值,此外,該方法觸發ProgressChanged事件,在是此事件中,通過ProgressChangedEventArgs的實例,接收到主線程傳遞過來的參數。
3.bgMeet.DoWork += new DoWorkEventHandler(bgMeet_DoWork);//後臺需要做的
4.bgMeet.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgMeet_RunWorkerCompleted);//完成後,反饋
下麵是dowork方法:
1.loading控制項顯示
this.Dispatcher.Invoke(DispatcherPriority.Background,new Action(() =>
{
this.loading.Visibility = Visibility.Visible;
}));//這裡需要用dispatcher.invoke 因為WPF卻明確的規定:UI元素只能由其主線程來操作
2.從介面獲取數據 getData();//這裡訪問介面不能用dispatcher.invoke 否則會造成頁面假死現象 因為子線程去訪問時,由於時間長,會造成UI卡住
3.渲染數據
下麵是completed方法:隱藏loading控制項
void bgMeet_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
this.Dispatcher.Invoke(DispatcherPriority.Background, new Action(() =>
{
this.loading.Visibility = Visibility.Collapsed;
}));
}