2013-02-04 32 views
2

我對UIElement.Visibility屬性有疑問。當點擊「StartAll」按鈕時,執行爲什麼控件的可見性屬性不會立即更新?

以下代碼:

private void butStartAllClick(object sender, RoutedEventArgs e) 
    { 
     butStartAll.Content = "Running"; 

     LEDInitializing.Visibility = Visibility.Visible; 
     lblInitializing.Visibility = Visibility.Visible; 

     Init(); 

     //...rest of code 
    } 

初始化然後啓動一個冗長的初始化例程。我的問題是,只能修改Init()方法的結束處的可見性屬性。

如何讓它立即更新?

我已經使用分派像這樣嘗試:

LEDInitializing.Dispatcher.BeginInvoke(
       System.Windows.Threading.DispatcherPriority.Normal, 
            new Action(
             delegate() 
             { 
              LEDInitializing.Visibility = Visibility.Visible; 
             } 
             )); 

但是,這並沒有解決我的問題。

任何援助將不勝感激:)

+1

不要在GUI線程上做冗長的東西。永遠。完全一樣。使用'await/async'或一些將長期任務旋轉到單獨線程的方法。 – millimoose

回答

2

通過UI線程上運行Init,你是防止任何用戶界面的變化,你運行,直到它完成和butStartAllClick退出後做出。根據什麼在Init你可能只能夠在一個單獨的線程中運行它(4.5這裏,在4.0使用TaskFactory):

private void butStartAllClick(object sender, RoutedEventArgs e) 
{ 
    butStartAll.Content = "Running"; 

    LEDInitializing.Visibility = Visibility.Visible; 
    lblInitializing.Visibility = Visibility.Visible; 

    Task.Run(() => 
    { 
     Init(); 
     //...rest of code 
    }); 
} 

如果Init或下面的代碼做任何事情,需要與UI交互那麼您需要將其分解並使用回調來根據需要進行更新。 4.5中的async/await模式通常是最簡單的方法,但您可以通過手動設置Task延續得到4.0中的相同效果。

相關問題