2013-04-22 81 views
1

我想在加載頁面時顯示加載動畫。我使用Thread根據用戶請求加載多個/多個用戶控件。我曾嘗試以下方法顯示在wpf中加載動畫

  1. this.Dispatcher.BeginInvoke(new Action(LoadSecondPageData), DispatcherPriority.Background); 當我用這它使我的加載動畫凍結,直到頁面加載

  2. 我也試過BackgroundWorker概念加載動畫是在這裏工作,但它是不允許加載usercontrols並給出錯誤。

錯誤:「調用線程必須是STA,因爲很多UI組件都需要這個。」

+0

你在使用依賴注入嗎?您是否使用在啓動或程序集本身加載業務數據? – 2013-04-22 15:31:23

+0

是的我在啓動時加載數據,但我沒有使用任何依賴注入。我從外部文件中檢索數據並根據頁面加載的數據創建用戶控件 – nandu 2013-04-22 15:39:46

+0

LoadSecondPageData中的內容是什麼?你可以發佈代碼嗎? – Dilshod 2013-04-22 16:05:43

回答

0

您需要使用Dispatcher.BeginInvoke在主UI線程上啓動動畫,但任何數據加載都應在後臺線程上進行,以免動畫凍結。 加載數據時,任何影響依賴項屬性的最終更新都需要再次使用Dispatcher.BeginInvoke整理到UI線程中。

0

I also tried BackgroundWorker concept Loading animation is working here, but it is not allowing to load the usercontrols and giving an error.

這是設計,你不允許觸摸後臺線程中的UI端的任何東西,因爲它不會是STA。相反,將進度指示器綁定到線程可以修改的屬性,然後進度指示器將通過INotifyPropertyChanged事件獲取更新。

例如,如果你有一個ProgressBar勢必ProgressPercentage,或不確定的繁忙指示符勢必IsBusy

XAML

<ProgressBar x:Name="StatusBar" 
      Maximum="1" Value="{Binding ProgressPercentage}" /> 

Code

using (var backgroundWorker = new BackgroundWorker()) 
{ 
    backgroundWorker.DoWork += (s, ex) => 
    { 
     IsBusy = true; 
     StatusText = "Pretending to do something..."; 

     for (int i = 0; i < 100; i++) 
     { 
      ProgressPercentage = (i + 1)/100.0D; 
      Thread.Sleep(100); 
     } 
    }; 

    backgroundWorker.RunWorkerCompleted += (s, ex) => 
    { 
     IsBusy = false; 
     StatusText = "Export Complete."; 
    }; 

    backgroundWorker.RunWorkerAsync(); 
} 

的後臺線程將完成它的工作,UI線程在等待時不會阻塞,並且你的進度指向icator會隨着更新而更新。