2014-03-25 96 views
0

我已經環顧四周,但我很難找到一種方式來實現以下:顯示進度條,而網絡瀏覽器加載在WPF

我有一個WPF應用程序用了一個Web瀏覽器控件。我有一個文件保存在磁盤上,我正在使用Navigate方法來加載文件。

我有一個事件處理程序附加到Web瀏覽器的LoadCompleted事件,這個工程。

但是,頁面可能需要很長時間才能加載。我想顯示一個進度條(最好在狀態欄中,但是新窗口沒問題),但我無法找到這樣做。

我試過的每一件事情(後臺工作者,線程)都說調用線程必須是STA,並且似乎進度條作爲一個UI元素,只能在UI線程上更新 - 它被阻止在頁面呈現期間由網頁瀏覽器控制。

或者有沒有辦法在新的線程中運行Web瀏覽器控件?我猜測這不是因爲這也是一個UI元素。

任何幫助,將不勝感激。

p.s.進度條是一個簡單的不確定的欄;我不想更新狀態 - 只是在頁面加載時顯示。

+0

http://msdn.microsoft.com/en-us/library/ms144190.aspx – Paparazzi

+0

這並不是說是數據的下載問題; Web瀏覽器控件會阻塞該線程,直到它下載並顯示數據。而且,這可能會導致其他項目,如圖像和JavaScript/CSS。 –

回答

0

所有UI控件都會堅持只通過UI線程更新它們。這在WinForms和WPF中都是標準的。在WPF中,這個線程編組是使用Dispatcher完成的,最好是用於創建控件的一個,但如果對控件的引用不可用(比如說,在MVVM環境中,應用程序調度程序將會很好。)

從使用分派另一個線程更新一個UI元素通常的模式是

private void UpdateStatusBar(int progress) 
{ 
    if (!Application.Current.Dispatcher.CheckAccess()) 
    { 
     Application.Current.Dispatcher.Invoke(() => UpdateStatusBar(progress)); 
     return; 
    } 

    // update status here 
} 
+0

我不想從另一個線程進行更新。目前我有一個線程,但進度條在Web瀏覽器正在工作時停止。我正在嘗試將進度條或網頁瀏覽器控件移到不同的線程,以便進度條可以更新。有一件事我可能不清楚的是當我看到更新進度條時,我的意思是重繪,因爲它在Web瀏覽器呈現頁面時停止/暫停。 –

+0

然後我建議在一個線程上運行WebBrowser導航,並隨意更新另一個線程上的進度條,並在WebBrowser.LoadCompleted事件觸發時完成進度。 –

+0

您是否有任何有關如何在單獨線程上運行導航的示例?目前我的代碼只是WebBrowser.Navigate(fileName); –

相關問題