Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在新选项卡中打开链接(WebBrowser控件)_C#_.net_Winforms_Webbrowser Control_Tabcontrol - Fatal编程技术网

C# 在新选项卡中打开链接(WebBrowser控件)

C# 在新选项卡中打开链接(WebBrowser控件),c#,.net,winforms,webbrowser-control,tabcontrol,C#,.net,Winforms,Webbrowser Control,Tabcontrol,有人知道如何在WinForms应用程序中单击WebBrowser控件中的链接,然后在我的TabControl中的新选项卡中打开该链接吗 我已经搜索了几个月,看过很多教程/文章/代码示例,但似乎以前没有人在C#中尝试过 非常感谢您的建议/样品 谢谢。根据您的评论,我知道您希望捕获WebBrowser控件的“在新窗口中打开”操作,并替代默认行为,在应用程序内的新选项卡中打开 private Uri _MyUrl; System.Windows.Forms.WebBrowser browse

有人知道如何在WinForms应用程序中单击WebBrowser控件中的链接,然后在我的TabControl中的新选项卡中打开该链接吗

我已经搜索了几个月,看过很多教程/文章/代码示例,但似乎以前没有人在C#中尝试过

非常感谢您的建议/样品


谢谢。

根据您的评论,我知道您希望捕获WebBrowser控件的“在新窗口中打开”操作,并替代默认行为,在应用程序内的新选项卡中打开

private Uri _MyUrl;    

System.Windows.Forms.WebBrowser browser = new System.Windows.Forms.WebBrowser();
browser.Navigating += new System.Windows.Forms.WebBrowserNavigatingEventHandler(browser_Navigating);


void browser_Navigating(object sender, System.Windows.Forms.WebBrowserNavigatingEventArgs e)
{
    _MyUrl = e.Url;
    e.Cancel;
}
要可靠地完成这一点,您需要获取NewWindow2事件,该事件公开ppDisp(指向应打开新窗口的WebBrowser控件的可设置指针)。 所有其他可能的黑客攻击解决方案(例如在OpenWindow事件之前获得用户选择的最后一个链接)都不是最优的,在极端情况下注定会失败

幸运的是,在仍然使用System.Windows.Forms.WebBrowser控件作为基础的情况下,有一种(相对)简单的方法可以实现这一点。您只需扩展WebBrowser并截获NewWindow2事件,同时提供对ActiveX实例的公共访问(用于在新选项卡中传递到ppDisp)。这在以前就已经做过了,毛里西奥·罗哈斯(Mauricio Rojas)有一个完整的工人阶级“ExtendedWebBrowser”的极好例子:

拥有ExtendedWebBrowser类后,您需要做的就是为NewWindow2设置处理程序,并将ppDisp指向新选项卡中的浏览器。下面是我总结的一个例子:

    private void InitializeBrowserEvents(ExtendedWebBrowser SourceBrowser)
    {
        SourceBrowser.NewWindow2 += new EventHandler<NewWindow2EventArgs>(SourceBrowser_NewWindow2);
    }

    void SourceBrowser_NewWindow2(object sender, NewWindow2EventArgs e)
    {

        TabPage NewTabPage = new TabPage()
        {
            Text = "Loading..."
        };

        ExtendedWebBrowser NewTabBrowser = new ExtendedWebBrowser()
        {
            Parent = NewTabPage,
            Dock = DockStyle.Fill,
            Tag = NewTabPage
        };

        e.PPDisp = NewTabBrowser.Application;
        InitializeBrowserEvents(NewTabBrowser);

        Tabs.TabPages.Add(NewTabPage);
        Tabs.SelectedTab = NewTabPage;

    }

    private void Form1_Load(object sender, EventArgs e)
    {

        InitializeBrowserEvents(InitialTabBrowser);

    }
private void InitializeBrowserEvents(ExtendedWebBrowser源浏览器)
{
SourceBrowser.NewWindow2+=新事件处理程序(SourceBrowser\u NewWindow2);
}
void SourceBrowser\u NewWindow2(对象发送器,NewWindow2EventArgs e)
{
TabPage NewTabPage=新TabPage()
{
Text=“正在加载…”
};
ExtendedWebBrowser NewTabBrowser=新的ExtendedWebBrowser()
{
父项=NewTabPage,
Dock=DockStyle.Fill,
Tag=NewTabPage
};
e、 PPDisp=NewTabBrowser.Application;
初始化浏览器事件(NewTabBrowser);
Tabs.TabPages.Add(NewTabPage);
Tabs.SelectedTab=NewTabPage;
}
私有void Form1\u加载(对象发送方、事件参数e)
{
InitializeBrowserEvents(InitializeBrowser);
}
(假设TabControl名为“Tabs”,初始选项卡包含子控件停靠的扩展WebBrowser名为“InitialWebBrowser”)


不要忘记在关闭选项卡时注销事件

web浏览器控件中没有选项卡,因此您需要自己处理选项卡。在web浏览器控件上方添加选项卡控件,并在打开新选项卡时创建新的web浏览器控件。当用户打开新窗口并打开新选项卡时,捕获并取消操作。

以下代码有效,只需按照第一个回复创建ExtendedWebBrowser类即可

我用它来打开一个新标签,但它也可以用你的浏览器而不是IE来打开一个新窗口

希望能有帮助

 private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        if (current_tab_count == 10) return;
        TabPage tabPage = new TabPage("Loading...");
        tabpages.Add(tabPage);
        tabControl1.TabPages.Add(tabPage);
        current_tab_count++;
        ExtendedWebBrowser browser = new ExtendedWebBrowser();
        InitializeBrowserEvents(browser);
        webpages.Add(browser);
        browser.Parent = tabPage;
        browser.Dock = DockStyle.Fill;
        browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(browser_DocumentCompleted);
        browser.DocumentTitleChanged += new EventHandler(Browser_DocumentTitleChanged);
        browser.Navigated += Browser_Navigated;
        browser.IsWebBrowserContextMenuEnabled = true;
public void InitializeBrowserEvents(ExtendedWebBrowser browser)
    {
        browser.NewWindow2 += new EventHandler<ExtendedWebBrowser.NewWindow2EventArgs>(Browser_NewWindow2);
    }

    void Browser_NewWindow2(object sender, ExtendedWebBrowser.NewWindow2EventArgs e)
    {

        if (current_tab_count == 10) return;
        TabPage tabPage = new TabPage("Loading...");
        tabpages.Add(tabPage);
        tabControl1.TabPages.Add(tabPage);
        current_tab_count++;
        ExtendedWebBrowser browser = new ExtendedWebBrowser();
        webpages.Add(browser);
        browser.Parent = tabPage;
        browser.Dock = DockStyle.Fill;
        browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(browser_DocumentCompleted);
        browser.DocumentTitleChanged += new EventHandler(Browser_DocumentTitleChanged);
        browser.Navigated += Browser_Navigated;
        tabControl1.SelectedTab = tabPage;
        browser.Navigate(textBox.Text);

        {
            e.PPDisp = browser.Application;
            InitializeBrowserEvents(browser); 
        }
private void Window\u已加载(对象发送方,路由目标)
{
如果(当前选项卡计数==10)返回;
TabPage TabPage=新TabPage(“加载…”);
tabpages.Add(tabPage);
tabControl1.TabPages.Add(tabPage);
当前选项卡计数++;
ExtendedWebBrowser=新的ExtendedWebBrowser();
初始化浏览器事件(浏览器);
网页。添加(浏览器);
browser.Parent=tabPage;
browser.Dock=DockStyle.Fill;
browser.DocumentCompleted+=新的WebBrowserDocumentCompletedEventHandler(browser\u DocumentCompleted);
browser.DocumentTitleChanged+=新事件处理程序(browser\u DocumentTitleChanged);
browser.Navigated+=已导航的浏览器;
browser.IsWebBrowserContextMenuEnabled=true;
public void InitializeBrowserEvents(扩展WebBrowser浏览器)
{
browser.NewWindow2+=新事件处理程序(browser\u NewWindow2);
}
无效浏览器\u NewWindow2(对象发送器,扩展WebBrowser.NewWindow2EventArgs e)
{
如果(当前选项卡计数==10)返回;
TabPage TabPage=新TabPage(“加载…”);
tabpages.Add(tabPage);
tabControl1.TabPages.Add(tabPage);
当前选项卡计数++;
ExtendedWebBrowser=新的ExtendedWebBrowser();
网页。添加(浏览器);
browser.Parent=tabPage;
browser.Dock=DockStyle.Fill;
browser.DocumentCompleted+=新的WebBrowserDocumentCompletedEventHandler(browser\u DocumentCompleted);
browser.DocumentTitleChanged+=新事件处理程序(browser\u DocumentTitleChanged);
browser.Navigated+=已导航的浏览器;
tabControl1.SelectedTab=tabPage;
browser.Navigate(textBox.Text);
{
e、 PPDisp=browser.Application;
初始化浏览器事件(浏览器);
}

我在这个主题上做了一些研究,不需要做ExtendedWebBrowser类中存在的所有COM管道,因为该代码已经存在于生成的Interop.SHDocVw中。因此,我能够使用下面更自然的构造来订阅NewWindow2事件。在Visual Studio中,我必须添加一个引用“微软互联网控制”的缩写


请阅读了解更多信息。这是本系列的第5页,为了完全理解,我必须返回并阅读第3->5页。

您只需取消新窗口事件并自行处理导航和选项卡内容

这是一个完全有效的示例。假设您有一个tabcontrol,并且至少有一个tab页

using System.ComponentModel;
using System.Windows.Forms;

namespace stackoverflow2
{

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.webBrowser1.NewWindow += WebBrowser1_NewWindow;
            this.webBrowser1.Navigated += Wb_Navigated;
            this.webBrowser1.DocumentText=
             "<html>"+
             "<head><title>Title</title></head>"+
             "<body>"+
             "<a href = 'http://www.google.com' target = 'abc' > test </a>"+
             "</body>"+
             "</html>";
        }
        private void WebBrowser1_NewWindow(object sender, CancelEventArgs e)
        {
            e.Cancel = true; //stop normal new window activity

            //get the url you were trying to navigate to
            var url= webBrowser1.Document.ActiveElement.GetAttribute("href");

            //set up the tabs
            TabPage tp = new TabPage();
            var wb = new WebBrowser();
            wb.Navigated += Wb_Navigated;
            wb.Size = this.webBrowser1.Size;
            tp.Controls.Add(wb);
            wb.Navigate(url);
            this.tabControl1.Controls.Add(tp);
            tabControl1.SelectedTab = tp;
        }

        private void Wb_Navigated(object sender, WebBrowserNavigatedEventArgs e)
        {
            tabControl1.SelectedTab.Text = (sender as WebBrowser).DocumentTitle;
        }
    }
}
使用System.ComponentModel;
使用System.Windows.Forms;
命名空间堆栈溢出2
{
公共部分类Form1:Form
{
公共表格1()
{
初始化组件();
这是webBrowser1.N
using System.ComponentModel;
using System.Windows.Forms;

namespace stackoverflow2
{

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.webBrowser1.NewWindow += WebBrowser1_NewWindow;
            this.webBrowser1.Navigated += Wb_Navigated;
            this.webBrowser1.DocumentText=
             "<html>"+
             "<head><title>Title</title></head>"+
             "<body>"+
             "<a href = 'http://www.google.com' target = 'abc' > test </a>"+
             "</body>"+
             "</html>";
        }
        private void WebBrowser1_NewWindow(object sender, CancelEventArgs e)
        {
            e.Cancel = true; //stop normal new window activity

            //get the url you were trying to navigate to
            var url= webBrowser1.Document.ActiveElement.GetAttribute("href");

            //set up the tabs
            TabPage tp = new TabPage();
            var wb = new WebBrowser();
            wb.Navigated += Wb_Navigated;
            wb.Size = this.webBrowser1.Size;
            tp.Controls.Add(wb);
            wb.Navigate(url);
            this.tabControl1.Controls.Add(tp);
            tabControl1.SelectedTab = tp;
        }

        private void Wb_Navigated(object sender, WebBrowserNavigatedEventArgs e)
        {
            tabControl1.SelectedTab.Text = (sender as WebBrowser).DocumentTitle;
        }
    }
}