2013-11-05 66 views
0

我開始了兩個WPF中的背靠背過程,其中UI之間發生了變化。還有一個while循環包裝它。所以,代碼看起來類似於這樣:在兩個過程運行之間更新WPF中的主要用戶界面

while(stackpanel.Children.Count != 0) 
{ 
    Grid grid = stackpanel.Children[0] as Grid; 

    // start process 1 and WaitForExit() 

    stackpanel.Remove(grid); 

    // start process 2 and WaitForExit() 
} 

的問題是,用戶界面沒有更新的第一進程存在,第二個開始之前之後。它只在while循環終止時更新一次。

我該如何實現上述邏輯並能夠重新繪製stackpanel?

回答

1

你是waiting on UI thread which won't let refresh your UI,直到你退出方法。 我強烈建議move your long running process on to seperate thread並等待它,一旦完成,馬歇爾你通過分派器回調到UI線程。

但是,您可以通過簡單地在排隊優先UI調度空委託設置爲渲染,使您的用戶界面得到刷新使用的解決方法 -

while(stackpanel.Children.Count != 0) 
    { 
     Grid grid = stackpanel.Children[0] as Grid; 

     // start process 1 and WaitForExit() 

     stackpanel.Remove(grid); 

     Dispatcher.Invoke((Action)(() => { }), DispatcherPriority.Render); 

     // start process 2 and WaitForExit() 
    } 

請參閱我的答案在here瞭解詳情。

+0

謝謝。用戶界面正在更新。但是,只有在第二個循環結束後纔會觀察到第一個更新。你還可以發佈示例代碼移動長時間運行的進程來分離線程並等待它們嗎? – Mark13426

+0

請參閱答案中的udpate。從用戶界面中刪除項目以使其在堆棧面板上刷新後,空委託應該在分派器上排隊。 –

0

你試過這些:UpdateLayout()stackPanel.InvalidateVisual()?可能是PropertyChanged with String.Empty

+0

剛剛嘗試了前兩個。他們不工作。 – Mark13426

+0

如果你會發布一些我可以用來運行一些測試的代碼,我可以進一步幫助... – Noctis

相關問題