【WPF】监听WPF的WebBrowser控件弹出新窗口的事件
2010-05-27 15:34
731 查看
WPF中自带一个WebBrowser控件,当我们使用它打开一个网页,例如百度,然后点击它其中的链接时,如果这个链接是会弹出一个新窗口的,那么它会生生的弹出一个IE窗口来,而不是在内部跳到该链接。
如果使用Winform的WebBrowser控件,我们可以监听它的NewWindow事件,在这个事件中做一些处理,例如,在新建一个Tab来打开,或者控制它在当前WebBrowser中跳转。很不幸的是,WPF的WebBrowser没有这个事件。
说到底,Winform的WB或者是WPF的WB都是在调用IE的一个控件,因此,Winform能加上的,我们WPF一定也有办法加上。如此,那我们就请出神器Reflector,研究一把。
首先,我们打开Winform的WebBrowser,找到触发NewWindow事件的代码:
protected virtual void OnNewWindow(CancelEventArgs e)
{
if (this.NewWindow != null)
{
this.NewWindow(this, e);
}
}
它是在OnNewWindow方法中触发的。那么,是谁调用了这个OnNewWindow呢?接着搜索,最后在一个叫WebBrowserEvent的类里面发现这么一段:
public void NewWindow2(ref object ppDisp, ref bool cancel)
{
CancelEventArgs e = new CancelEventArgs();
this.parent.OnNewWindow(e);
cancel = e.Cancel;
}
我们接着搜NewWindow2,却发现没有地方显式地调用它了。既然从方法入手没找到,那我们就来研究一下定义这个方法的WebBrowserEvent,看看是谁在使用它。
仔细搜索一遍,最后发现在WebBrowser的CreateSink方法中有这么一段:
代码
private void Attach()
{
var axIWebBrowser2 = _webBrowser.ReflectGetProperty("AxIWebBrowser2");
var webBrowserEvent = new WebBrowserEvent(this);
var cookieType = typeof(WebBrowser).Assembly.GetType("MS.Internal.Controls.ConnectionPointCookie");
_cookie = Activator.CreateInstance(
cookieType,
ReflectionService.BindingFlags,
null,
new[] { axIWebBrowser2, webBrowserEvent, typeof(DWebBrowserEvents2) },
CultureInfo.CurrentUICulture);
}
最后的使用:
var webBrowserHelper = new WebBrowserHelper(webBrowser);
......
webBrowserHelper.NewWindow += WebBrowserOnNewWindow;
【效果图】
初始网页:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/04/95ede54e6fe6e02a9471cdb1efc3ed0d.png)
点击一个链接,默认情况下,将是弹出一个IE窗口,现在是在新的Tab中打开:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/04/b0a190a6a56eacabe88fcb23c3ce8bf8.png)
【示例代码】
(新建按钮点击后,请输入完整的网址,例如:http://www.sina.com)
/Files/RMay/WpfWebBrowser.zip
如果使用Winform的WebBrowser控件,我们可以监听它的NewWindow事件,在这个事件中做一些处理,例如,在新建一个Tab来打开,或者控制它在当前WebBrowser中跳转。很不幸的是,WPF的WebBrowser没有这个事件。
说到底,Winform的WB或者是WPF的WB都是在调用IE的一个控件,因此,Winform能加上的,我们WPF一定也有办法加上。如此,那我们就请出神器Reflector,研究一把。
首先,我们打开Winform的WebBrowser,找到触发NewWindow事件的代码:
protected virtual void OnNewWindow(CancelEventArgs e)
{
if (this.NewWindow != null)
{
this.NewWindow(this, e);
}
}
它是在OnNewWindow方法中触发的。那么,是谁调用了这个OnNewWindow呢?接着搜索,最后在一个叫WebBrowserEvent的类里面发现这么一段:
public void NewWindow2(ref object ppDisp, ref bool cancel)
{
CancelEventArgs e = new CancelEventArgs();
this.parent.OnNewWindow(e);
cancel = e.Cancel;
}
我们接着搜NewWindow2,却发现没有地方显式地调用它了。既然从方法入手没找到,那我们就来研究一下定义这个方法的WebBrowserEvent,看看是谁在使用它。
仔细搜索一遍,最后发现在WebBrowser的CreateSink方法中有这么一段:
代码
private void Attach()
{
var axIWebBrowser2 = _webBrowser.ReflectGetProperty("AxIWebBrowser2");
var webBrowserEvent = new WebBrowserEvent(this);
var cookieType = typeof(WebBrowser).Assembly.GetType("MS.Internal.Controls.ConnectionPointCookie");
_cookie = Activator.CreateInstance(
cookieType,
ReflectionService.BindingFlags,
null,
new[] { axIWebBrowser2, webBrowserEvent, typeof(DWebBrowserEvents2) },
CultureInfo.CurrentUICulture);
}
最后的使用:
var webBrowserHelper = new WebBrowserHelper(webBrowser);
......
webBrowserHelper.NewWindow += WebBrowserOnNewWindow;
【效果图】
初始网页:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/04/95ede54e6fe6e02a9471cdb1efc3ed0d.png)
点击一个链接,默认情况下,将是弹出一个IE窗口,现在是在新的Tab中打开:
![](https://oscdn.geek-share.com/Uploads/Images/Content/202011/04/b0a190a6a56eacabe88fcb23c3ce8bf8.png)
【示例代码】
(新建按钮点击后,请输入完整的网址,例如:http://www.sina.com)
/Files/RMay/WpfWebBrowser.zip
相关文章推荐
- 【WPF】监听WPF的WebBrowser控件弹出新窗口的事件
- [WPF - 之一问一答系列] 如何从WPF的WebBrowser控件中获得WebResponse内容?为何WebBrowser控件的Navigated事件参数NavigationEventArgs的WebResponse属性始终为null?
- WinForm中的webBrowser控件禁止弹出新窗口
- C# winform使用webbrowser控件,不弹出新的页面,只在当前窗口打开
- VS C# .NET WebBrowser控件 利用插入JS代码,实现控制弹出IE窗口
- WebBrowser控件应用:弹出新窗体和关闭窗口
- VC6.0 MFC中WebBrowser控件禁止新窗口弹出的解决办法
- VC,webbrowser控件中弹出新网页窗口
- VC6.0 MFC中WebBrowser控件禁止新窗口弹出的解决办法
- WPF的WebBrowser屏蔽弹出脚本错误窗口
- wpf 窗口最小化后,触发某事件弹出最小化窗口并置顶
- 为什么用PopUpManager弹出的窗口产生的事件在主窗口无法监听到?
- Flex里监听mouseDownOutside事件解决弹出窗口点击空白关闭功能
- WebBrowser控件应用:弹出新窗体和关闭窗口
- 在WebBrowser控件打开的网页链接后直接打开而不新弹出IE窗口来打开
- WPF 委托和事件实现子窗口回调函数, 实时刷新主窗口控件
- vs2008MFC中WebBrowser控件禁止新窗口弹出的解决办法
- wpf中webbrowser弹出windows 安全警告窗口的处理
- C++实现WebBrowser控件中对鼠标点击事件的监听,并获取所点击标签的超链接
- WebBrowser控件应用:弹出新窗体和关闭窗口 (转)