2012-09-06 65 views
8

假設WPF WebBrowser control顯示一些導航錯誤,並且該頁面未顯示。如何處理WPF WebBrowser控件導航異常

所以有一個例外WPF WebBrowser control

我發現了一些類似的問題here但它不是我所需要的。

事實上,我需要一些方法和對象,有一個例外,讓它得到一些如何。

我們該如何處理?

謝謝!

P.S.有一些WinForm WebBrowser控件的方法...我們可以做類似的控制WPF WebBrowser嗎?

public Form13() 
{ 
    InitializeComponent(); 

    this.webBrowser1.Navigate("http://blablablabla.bla"); 

     SHDocVw.WebBrowser axBrowser = (SHDocVw.WebBrowser)this.webBrowser1.ActiveXInstance; 
     axBrowser.NavigateError += 
      new SHDocVw.DWebBrowserEvents2_NavigateErrorEventHandler(axBrowser_NavigateError); 
} 

void axBrowser_NavigateError(object pDisp, ref object URL, 
     ref object Frame, ref object StatusCode, ref bool Cancel) 
{ 
    if (StatusCode.ToString() == "404") 
    { 
     MessageBox.Show("Page no found"); 
    } 
} 

附: #2爲主持WinForm WebBrowser控件下WPF應用程序不是我想的答案。

回答

8

我正在努力解決類似的問題。當電腦失去互聯網連接時,我們希望以一種很好的方式處理。

由於缺乏更好的解決方案,我連接了WebBrowser的Navigated事件並查看文檔的url。如果它是re​​s://ieframe.dll我很確信有一些錯誤已經發生。

也許可以看看文件,看看服務器返回404

private void Navigated(object sender, NavigationEventArgs navigationEventArgs) 
{ 
    var browser = sender as WebBrowser; 
    if(browser != null) 
    { 
     var doc = AssociatedObject.Document as HTMLDocument; 
     if (doc != null) 
     { 
      if (doc.url.StartsWith("res://ieframe.dll")) 
      { 
       // Do stuff to handle error navigation 
      } 
     } 
    } 
} 
+0

前段時間我把類似的代碼放到'LoadCompleted'事件中。但有時生產中的doc.url會返回null或空值。所以我認爲即使代碼在'Navigated'處理程序中,這種方法也不可靠。 – Lu55

+0

什麼是'AssociatedObject.Document'?它不清楚(我使用WPF,順便說一句) – Jack

6

這是老問題,但自從我通過這個苦,我雖然我可能也分享。首先,我實施了Markus的解決方案,但想要更好一些,因爲我們的防火牆重新映射了403個消息頁面。

我找到了一個回答here(在其他地方),建議使用NavigationService,因爲它有一個NavigationFailed事件。

在XAML中,添加:

<Frame x:Name="frame"/> 

在代碼中隱藏的構造函數中添加:

frame.Navigated += new System.Windows.Navigation.NavigatedEventHandler(frame_Navigated); 
frame.NavigationFailed += frame_NavigationFailed; 
frame.LoadCompleted += frame_LoadCompleted; 

frame.NavigationService.Navigate(new Uri("http://theage.com.au")); 

處理程序現在可與失敗的導航或成功的一個處理

void frame_NavigationFailed(object sender, System.Windows.Navigation.NavigationFailedEventArgs e) 
{ 
    e.Handled = true; 
    // TODO: Goto an error page. 
} 

private void frame_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e) 
{ 
    System.Diagnostics.Trace.WriteLine(e.WebResponse.Headers); 
} 

BTW:.NET 4.5框架

+0

這看起來非常好!太糟糕了,我無法訪問我已經實現我的解決方案的代碼庫,所以我可以測試它。:( – Markus

+0

看起來很有希望,但它並沒有從框架內的用戶發起的導航中獲取。事件僅針對我最初製作的Navigate()調用觸發。 – RandomEngy

1

這裏也可以使用dynamic方法。

wb.Navigated += delegate(object sender, NavigationEventArgs args) 
     { 
      dynamic doc = ((WebBrowser)sender).Document; 
      var url = doc.url as string; 
      if (url != null && url.StartsWith("res://ieframe.dll")) 
      { 
       // Do stuff to handle error navigation 
      } 
     };