2015-10-16 53 views
0
//Code to show a control goes here 
var DispatcherOperation = this.ParentWindow.Dispatcher.BeginInvoke((Action)(() => 
{ 
    //Do stuff 
})); 

DispatcherOperation.Completed += (s, e) => 
{ 
    if (DispatcherOperation.Status == System.Windows.Threading.DispatcherOperationStatus.Completed) 
    { 
     //Code to hide control shown above goes here 
    } 
}; 

我想要的是在需要完成的工作正在工作時顯示某個控件,然後在完成時隱藏該控件(將顯示新的東西)。這基本上就像一個加載算法,我猜。調度員完成的事件不按預期方式工作

我對Dispatcher方法BeginInvoke的理解是它用於異步執行UI操作。然而,當我運行這個時,看起來整個應用程序凍結,而調度員調用該函數。結果是我試圖展示的控制從未實際顯示。

這是爲什麼?

+0

這是完全顛倒 –

+0

***我想從來沒有真正顯示控件顯示***你應該添加實際的代碼,以顯示你的控制,從目前的評論來看,它顯示的地方仍然令人困惑。 –

+0

您可能正在UI線程上執行長時間運行的操作,從而阻止UI線程執行消息泵和更新。只調用分派器上的UI更改,在單獨的「Task」(最好)或線程中運行長時間運行的操作。 –

回答

0

請使用TaskScheduler替換您的邏輯。 msdn的鏈接爲它的工作方式提供了一個體面的例子。

https://msdn.microsoft.com/en-us/library/dd997394(v=vs.110).aspx

快照

 var tiledImage = Task.Factory.ContinueWhenAll(
      images, (i) => TileImages(i)); 

     // We are currently on the UI thread. Save the sync context and pass it to 
     // the next task so that it can access the UI control "image1". 
     var UISyncContext = TaskScheduler.FromCurrentSynchronizationContext(); 

     // On the UI thread, put the bytes into a bitmap and 
     // and display it in the Image control. 
     var t3 = tiledImage.ContinueWith((antecedent) => 
     { 
      ... 
      ... 
     }, UISyncContext); 
+0

我得到第一行創建一個新任務,但我不理解這個部分:'(i)=> TileImages(i)'。什麼是'TileImages'?我在「做東西」之前試圖展示的圖像已經動畫並準備好了,所以我不應該將字節放到位圖中然後顯示它,我只需要顯示圖像控件。 –