2012-09-06 26 views
8

Giả sử WPF WebBrowser control hiển thị một số lỗi điều hướng và trang không hiển thị.Cách xử lý ngoại lệ điều hướng WPF WebBrowser điều hướng

Vì vậy, có ngoại lệ là WPF WebBrowser control.

Tôi đã tìm thấy một số câu hỏi tương tự here nhưng đó không phải là những gì tôi cần.

Trong thực tế, tôi cần một số phương pháp và đối tượng có ngoại lệ để làm cho nó một số cách.

Làm cách nào để chúng tôi có thể xử lý?

Cảm ơn bạn!

P.S. Có một số cách tiếp cận cho WinForm WebBrowser Control ... Chúng ta có thể làm một cái gì đó tương tự cho kiểm soát 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 Để lưu trữ WinForm WebBrowser kiểm soát theo WPF App không phải là một câu trả lời tôi nghĩ.

Trả lời

8

Tôi đang gặp khó khăn với một vấn đề tương tự. Khi máy tính mất kết nối internet, chúng tôi muốn xử lý điều đó một cách tốt đẹp.

Khi thiếu giải pháp tốt hơn, tôi đã kết nối sự kiện Điều hướng của WebBrowser và xem url của tài liệu. Nếu nó là res: //ieframe.dll Tôi khá tự tin rằng một số lỗi đã xảy ra.

Có lẽ chúng ta có thể nhìn vào các tài liệu và xem nếu một máy chủ trở lại 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

Một thời gian trước, tôi đã đặt mã tương tự vào sự kiện 'LoadCompleted'. Nhưng đôi khi 'doc.url' trong quá trình sản xuất trả về giá trị null hoặc rỗng. Vì vậy, tôi nghĩ rằng phương pháp này không đáng tin cậy ngay cả khi mã nằm trong trình xử lý 'Điều hướng'. – Lu55

+0

'AssociatedObject.Document' là gì? nó không phải là rõ ràng với tôi (Tôi đang sử dụng WPF, btw) – Jack

6

Đó là về câu hỏi cũ nhưng kể từ khi tôi vừa trải qua điều này, tôi mặc dù tôi có thể cũng chia sẻ. Đầu tiên, tôi đã thực hiện giải pháp của Markus nhưng muốn một cái gì đó tốt hơn một chút khi Firewall của chúng ta remaps 403 trang tin nhắn.

Tôi đã tìm thấy câu trả lời here (amoungst các địa điểm khác) đề xuất sử dụng NavigationService vì nó có sự kiện NavigationFailed.

Trong XAML của bạn, thêm:

<Frame x:Name="frame"/> 

Trong constructor của bạn code-behind của, thêm:

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")); 

Việc xử lý bây giờ có thể đối phó với một trong hai một hướng thất bại hay thành công một:

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

Điều này có vẻ thực sự tốt đẹp! Quá tệ Tôi không có quyền truy cập vào cơ sở mã nơi tôi đã triển khai giải pháp của mình nữa để tôi có thể kiểm tra điều này.:( – Markus

+0

Có vẻ đầy hứa hẹn nhưng không nhận được điều hướng do người dùng khởi tạo từ trong khung. Sự kiện chỉ kích hoạt cuộc gọi Điều hướng() mà ban đầu tôi đã thực hiện. – RandomEngy

1

Bạn cũng có thể sử dụng cách tiếp cận dynamic tại đây.

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 
      } 
     }; 
Các vấn đề liên quan