首页 文章

WebBrowser-Control - 单击链接打开默认浏览器

提问于
浏览
4

我在我的WPF应用程序中使用WebBrowser-Control

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

现在,当我导航到包含链接的mht页面并且用户单击此链接之一时,将在WebBrowser-Control中打开新页面 . 但它应该在一个新的Default-Browser-Window中打开 . 不应更改WebBrowser-Control中的内容 . 有没有办法改变这种行为?

3 回答

  • -1

    您可以在导航事件中使用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

    我不认为 WebBrowser 是这样的,即使在普通浏览器中,如果点击超链接并且它代表一个简单的URL(而不是基于javascript的超链接),它将打开该浏览器窗口中的URL(以及该特定选项卡)本身 . WebBrowser control模仿了浏览器本身的这种基本行为 .

    我想你可以右键单击超链接并说出"Open in New Window"(看看 WebBrowser 控件中是否启用了该选项) .

    如果禁用该选项,则可以使用特殊的HTMLHost API启用它 .

  • 12

    默认情况下,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];
            }
    

    欢迎提出改进建议 . 快乐的编码 .

相关问题