2012-06-07 56 views
4

打開默認瀏覽器,我使用WebBrowser-控制在我的WPF的應用程序一樣web瀏覽器 - 控制 - 在點擊鏈接

<WebBrowser x:Name="webBrowser" Margin="0,28,0,0" /> 

現在,當我瀏覽到一個MHT-網頁,其中包含的鏈接和用戶點擊在其中一個鏈接上,新頁面在WebBrowser-Control中打開。但它應該在新的Default-Browser-Window中打開。 WebBrowser-Control中的內容不應該改變。 有沒有辦法改變這種行爲?

回答

11

您可以在導航事件上使用Proces.Start()在默認瀏覽器中打開新頁面,並設置e.Cancel = true;以便控件中的頁面不會更改。

例子:

@ MainWindow.xaml.cs單擊鏈接而

using System.Diagnostics; 
using System.Windows; 
using System.Windows.Navigation; 

namespace OpenDefaultBrowser 
{ 
    public partial class MainWindow : Window 
    { 
     private static bool willNavigate; 

     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     private void webBrowser1_Navigating(object sender, NavigatingCancelEventArgs e) 
     { 
      // first page needs to be loaded in webBrowser control 
      if (!willNavigate) 
      { 
       willNavigate = true; 
       return; 
      } 

      // cancel navigation to the clicked link in the webBrowser control 
      e.Cancel = true; 

      var startInfo = new ProcessStartInfo 
      { 
       FileName = e.Uri.ToString() 
      }; 

      Process.Start(startInfo); 
     } 
    } 
} 

@ MainWindow.xaml

<Window x:Class="OpenDefaultBrowser.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="464" Width="1046"> 
    <Grid> 
     <WebBrowser Height="425" HorizontalAlignment="Left" Name="webBrowser1" VerticalAlignment="Top" Width="1024" Source="http://stackoverflow.com/" Navigating="webBrowser1_Navigating" /> 
    </Grid> 
</Window> 
+0

一個更安全的檢查可以是e.Uri == NULL。非點擊加載就是這種情況。 – t9mike

0

我不認爲WebBrowser是這樣的,即使在普通瀏覽器中,如果超鏈接被點擊並且它代表了一個簡單的URL(而不是基於JavaScript的超鏈接),它將在該瀏覽器窗口中打開URL該特定選項卡)本身。 WebBrowser控件模仿瀏覽器本身的這種基本行爲。

我想你可以右鍵單擊超鏈接並說「在新窗口中打開」(請參閱​​在WebBrowser控件中是否啓用該選項)。

如果該選項被禁用,您可以使用特殊的HTMLHost API來啓用該選項。

-1

默認Web瀏覽器控件不打開默認瀏覽器,它只會在Internet Explorer中打開在瀏覽器中單擊的鏈接。現在我們可以使用_DocumentCompleted事件,但它需要基於事件的觸發器(如鏈接按鈕)才能工作。現在的問題是如果瀏覽器控件中的html有href,那麼這甚至不起作用。解決方案是使用_NewWindow事件。代碼如下:

/* The event handler*/ 
private void webBrowser1_NewWindow(object sender, CancelEventArgs e) 
     { 
      var webbrowser = (WebBrowser)sender; 
      e.Cancel = true; 
      OpenWebsite(webbrowser.StatusText.ToString()); 
      webbrowser = null; 
     } 

/* The function call*/ 
public static void OpenWebsite(string url) 
     { 
      Process.Start(GetDefaultBrowserPath(), url); 
     } 

private static string GetDefaultBrowserPath() 
     { 
      string key = @"http\shell\open\command"; 
      RegistryKey registryKey = 
      Registry.ClassesRoot.OpenSubKey(key, false); 
      return ((string)registryKey.GetValue(null, null)).Split('"')[1]; 
     } 

邀請您提出改進建議。快樂的編碼。在上面的代碼中需要

+0

你不需要'GetDefaultBrowserPath'代碼。使用'Process.Start(url)'(即沒有'GetDefaultBrowserPath()'arg))更好,因爲它要求操作系統打開網頁,操作系統自然會使用默認瀏覽器。然後您不需要註冊表代碼,這可能會破壞兼容性。 – HughHughTeotl

+0

webbrowser控件沒有任何名爲DocumentCompleted或NewWindow的事件。你可以請分享xaml代碼嗎? – mans

0

還有一個功能:

private static string GetDefaultBrowserPath() 
    { 
     string key = @"http\shell\open\command"; 
     RegistryKey registryKey = 
     Registry.ClassesRoot.OpenSubKey(key, false); 
     return ((string)registryKey.GetValue(null, null)).Split('"')[1]; 
    }