请问有谁知道如何在WinForms应用程序的WebBrowser控件中单击链接,然后使该链接在我的TabControl内以新标签页的形式打开吗?
我已经搜索了数月,看过许多教程/文章/代码示例,但似乎没有人在C#中尝试过这个。
非常感谢任何建议/示例。
谢谢。
请问有谁知道如何在WinForms应用程序的WebBrowser控件中单击链接,然后使该链接在我的TabControl内以新标签页的形式打开吗?
我已经搜索了数月,看过许多教程/文章/代码示例,但似乎没有人在C#中尝试过这个。
非常感谢任何建议/示例。
谢谢。
根据您的评论,我了解到您想要捕获WebBrowser控件上的“在新窗口中打开”操作,并覆盖默认行为,使其在应用程序内的新标签页中打开。
为了可靠地实现此目标,您需要获取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);
}
假设存在一个名为“Tabs”的TabControl控件,其中包含名为“InitialWebBrowser”的ExtendedWebBrowser控件。
当选项卡关闭时,请不要忘记取消注册事件!
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;
}
我做了一些有关这个主题的研究,发现不需要在 ExtendedWebBrowser 类中进行所有存在的 COM 管道操作,因为该代码已经存在于生成的 Interop.SHDocVw 中。因此,我能够使用以下更自然的结构来订阅 NewWindow2 事件。在 Visual Studio 中,我必须添加对“Microsoft Internet Controls”的引用。
using SHDocVw;
...
internal WebBrowserSsoHost(System.Windows.Forms.WebBrowser webBrowser,...)
{
ParameterHelper.ThrowOnNull(webBrowser, "webBrowser");
...
(webBrowser.ActiveXInstance as WebBrowser).NewWindow2 += OnNewWindow2;
}
private void OnNewWindow2(ref object ppDisp, ref bool Cancel)
{
MyTabPage tabPage = TabPageFactory.CreateNewTabPage();
tabPage.SetBrowserAsContent(out ppDisp);
}
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);
}
您可以取消新窗口事件并自己处理导航和选项卡相关的内容。
这里有一个完整的工作示例。假设您已经有了一个选项卡控件和至少一个选项卡页面。
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;
}
}
}
Web浏览器控件中没有选项卡,因此您需要自己处理选项卡。在Web浏览器控件上方添加选项卡控件,并在打开新选项卡时创建新的Web浏览器控件。当用户打开新窗口时捕获并取消操作,改为打开新选项卡。