2012-01-10 26 views
7

Tôi đang cố gắng đánh chặn nhấn vào liên kết trong điều khiển WebBrowser. Trang HTML của tôi chứa các liên kết tùy chỉnh, đối với một số bắt đầu bằng chia sẻ: // Tôi muốn chặn khi người dùng chạm vào nó.Cách chặn khi người dùng nhấp vào liên kết trong một webbrowser

Trên iPhone, tôi sẽ sử dụng webView: shouldStartLoadWithRequest: navigationType: method và xem URL được chọn.

Tôi chưa quản lý để tái tạo hành vi tương tự với Silverlight cho Windows Phone.

tôi làm điều gì đó như:

{ 
     webBrowser1.Navigating += new EventHandler<NavigatingEventArgs>(webBrowser1_Navigating); 
    } 

    void webBrowser1_Navigating(object sender, NavigatingEventArgs e) 
    { 
     string scheme = null; 

     try 
     { 
      scheme = e.Uri.Scheme; // <- this is throwing an exception here 
     } 
     catch 
     { 
     } 
     if (scheme == null || scheme == "file") 
      return; 
     // Not going to follow any other link 
     e.Cancel = true; 
     if (scheme == "shared") 
     { 

     } 

Nhưng tôi đoán là một ngoại lệ khi đọc một số thuộc tính của Uri, khi đó là một Uri tiêu chuẩn với một tập tin mặc định: // URL Thêm vào đó, Duyệt sự kiện isn' t thậm chí được kích hoạt cho các liên kết bắt đầu bằng chia sẻ: //

Bây giờ tôi có thể chụp ảnh trên chia sẻ: // Tôi không quan tâm nhiều, nhưng ít nhất tôi muốn có thể truy xuất URL chúng tôi sẽ điều hướng đến và hủy hoạt động mặc định cho một URL cụ thể.

Bất kỳ ý tưởng gì đang xảy ra? Cảm ơn

Edit: Hóa ra là vấn đề là sự kiện Duyệt chỉ được tạo cho các liên kết sau đây: file: //, http: // hoặc mailto: // Các thuộc tính âm mưu của Uri là chỉ khả dụng cho các liên kết http: // và mailto: //

vì vậy những gì tôi đã làm cuối cùng sẽ thay thế liên kết được chia sẻ: // với http://shared/blah ... Và tôi xem URL ... Điều này phù hợp với mục đích của tôi. Bây giờ tôi có thể có các liên kết có hành động khác (như mở một cửa sổ phụ) tùy thuộc vào các liên kết trong html.

+0

Trên thực tế các ngoại lệ được ném cho mọi thứ trừ liên kết bên ngoài (url bắt đầu bằng http: //) hoặc email (url bắt đầu bằng mailto: //) – jyavenard

+1

Bạn đã thử sử dụng e.Uri.ToString() rồi phân tích cú pháp để truy xuất lược đồ? –

+0

Bạn phát hiện khi nào một 'shared: //' được nhấn? – keyboardP

Trả lời

5

Đây là mã cuối cùng của tôi, trong trường hợp này là hữu ích cho một người nào đó trong tương lai:

Đối với một khoảng màn hình, tôi sử dụng một file html hiển thị trong một thành phần WebBrowser. Trang giới thiệu có liên kết "nói cho bạn bè của bạn về ứng dụng này" cũng như liên kết tới trang web bên ngoài. Nó cũng có các trang con cục bộ.

Các trang con cục bộ được liên kết với việc sử dụng liên kết tệp: //. Chúng có thể được điều hướng trong thành phần WebBrowser. Các liên kết bên ngoài được mở ra bên ngoài với Internet Explorer. Giới thiệu liên kết bạn bè của bạn được tạo thành liên kết http://shared, mở ra email có chủ đề và nội dung được đặt trước. Thật không may, không có chương trình khác so với những tiêu chuẩn là có thể sử dụng vì chúng không gây ra một sự kiện Duyệt

Ngoài ra còn có một liên kết hỗ trợ mà là một mailto: // liên kết và mở ra một EmailComposeTask

void webBrowser1_Navigating(object sender, NavigatingEventArgs e) 
    { 
     String scheme = null; 

     try 
     { 
      scheme = e.Uri.Scheme; 
     } 
     catch 
     { 
     } 
     if (scheme == null || scheme == "file") 
      return; 
     // Not going to follow any other link 
     e.Cancel = true; 
     if (scheme == "http") 
     { 
      // Check if it's the "shared" URL 
      if (e.Uri.Host == "shared") 
      { 
       // Start email 
       EmailComposeTask emailComposeTask = new EmailComposeTask(); 
       emailComposeTask.Subject = "Sharing an app with you"; 
       emailComposeTask.Body = "You may like this app..."; 
       emailComposeTask.Show(); 
      } 
      else 
      { 
       // start it in Internet Explorer 
       WebBrowserTask webBrowserTask = new WebBrowserTask(); 
       webBrowserTask.Uri = new Uri(e.Uri.AbsoluteUri); 
       webBrowserTask.Show(); 
      } 
     } 
     if (scheme == "mailto") 
     { 
      EmailComposeTask emailComposeTask = new EmailComposeTask(); 
      emailComposeTask.To = e.Uri.AbsoluteUri; 
      emailComposeTask.Show(); 
     } 
    } 
+0

Bạn cũng có thể sử dụng lược đồ "about:". Nó thuận tiện cho bạn mọi thứ sau đại tràng ở AbsoluteUri. – Nedko

Các vấn đề liên quan