2012-09-06 9 views
8

WPF WebBrowser controlがナビゲーションエラーを示し、ページが表示されていないとします。WPF WebBrowserコントロールのナビゲーション例外を処理する方法

したがって、WPF WebBrowser controlの例外があります。

私はいくつかの同様の質問を見つけたhereしかし、それは私が必要なものではありません。

実際には、いくつかの方法と例外を持つオブジェクトが必要です。

どうすれば対応できますか?

ありがとうございました!

P.S. WinForm WebBrowser Controlにはいくつかのアプローチがあります... 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"); 
    } 
} 

P.S. #2 WPF Appの下でWinForm WebBrowserコントロールをホストするのは、私が考える答えではありません。

答えて

8

私は同様の問題を抱えています。コンピュータがインターネット接続を失うと、私たちはそれをうまく処理したい。

私はWebBrowserのNavigatedイベントをフックして、ドキュメントのURLを見ています。それがres://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'はヌルまたは空の値を返します。だから私はこのアプローチは、コードが 'Navigated'ハンドラにあっても信頼できないと思います。 – Lu55

+0

'AssociatedObject.Document'とは何ですか?それは私には分かりません(私はWPF、btwを使用しています) – Jack

6

を返された場合、それは古い問題ではなく、私も共有するかもしれませんが、私はちょうど私が、これによって苦しんでいるので、だ見ることが可能です。まず、Markusのソリューションを実装しましたが、私たちのファイアウォールが403のメッセージページを再マッピングするので、少し良いものが必要でした。

というイベントがあるので、NavigationServiceを使用していると回答したhere(他の場所にもあります)が見つかりました。あなたの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")); 

ハンドラが今失敗したナビゲーションや成功の1のいずれかに対処することができます

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 framework

+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 
      } 
     }; 
関連する問題