在wpf中使用winform webbrowser,winform webbrowser打包,
为什么使用winform webbrowser
我们在之前介绍过wpf的webbrowser,wpf的webbrowser坑太多了(js错误,无法获取newwindow事件...)所以不推荐使用它。而winform的webbrowser支持扩展,而且坑比较少,又有大量的资料,因此使用winform webbrowser是一件明确的选择。
为什么扩展winform webbrowser
举个例子在js中调用window.open().这个时候wpf与winform的webbrowser无法监测这个事件,这个时候我们就需要去扩展winform的webbrowser,增加NewWindow3事件,这样当js调用windows.open()时,应用程序中就可以做相应的处理了,如打开一个新的窗口。
如何扩展winform webbrowser
详细的代码请看githubhttps://github.com/huangruifeng/ExtendWebBrowser。
下面是整个扩展项目的类图:
其中ExtendWebBrowser继承至winform的控件WebBrowser,以及我们自定义用来描述webbrowser事件的接口IWebBrowserEvent。
ExtendedWebBrowserExtension类我主要是用来扩展WebBrowser,现在已经实现的功能有:根据url获取或者设置cookie,清理cookie,session。
DWebBrowserEvents2 接口描述了我们需要扩展的事件,当前项目只是扩展了其中的部分事件,即WebBrowserExtendedEvents中触发的事件。更多支持的事件可以看微软的官方文档:https://docs.microsoft.com/en-us/dotnet/api/shdocvw.dwebbrowserevents2?view=dynamics-usd-3。
如何给ExtendWebBrowser扩展DWebBrowserEvents2支持的事件
我们以DownloadBegin事件为例.总共分为4步:
1、在DWebBrowserEvents2中扩展DownloadBegin事件:
1 2 3 4 5 6 7 | [ComImport, Guid( "34A715A0-6587-11D0-924A-0020AFC7AC4D" ), InterfaceType(ComInterfaceType.InterfaceIsIDispatch), TypeLibType(TypeLibTypeFlags.FHidden)] public interface DWebBrowserEvents2 { //。。。省略之前的事件 [System.Runtime.InteropServices.DispId(106)] public void DownloadBegin (); } |
2、ExtendedWebBrowser与IWebBrowserEvent中增加想向外暴露的事件。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | public interface IWebBrowserEvent { event EventHandler<WebBrowserNavigateErrorEventArgs> NavigateError; event EventHandler<NewWindow2EventArgs> NewWindow2; event EventHandler<NewWindow3EventArgs> NewWindow3; event EventHandler<WindowClosingEventArgs> WindowClosing; event EventHandler<DocumentCompleteEventArgs> DocumentComplete; event EventHandler<CommandStateChangeEventArgs> CommandStateChange; //新加的事件 event EventHandler DownloadBegin; } public class ExtendedWebBrowser : WebBrowser, IWebBrowserEvent { //。。。现在已有的事件,以及其他逻辑。在这不实现具体请看github. public event EventHandler DownloadBegin; public void OnDownloadBegin() { if ( null != DownloadBegin) { DownloadBegin( this , new EventArgs()); } } } |
3、WebBrowserExtendedEvents 进行中转事件。
1 2 3 4 5 6 7 8 9 | public class WebBrowserExtendedEvents : StandardOleMarshalObject, DWebBrowserEvents2 { //。。。 //。。。 public void DownloadBegin () { _Browser.OnDownloadBegin(); } } |
4、在wpf中使用ExtendWebBrowser
ExtendWebBrowser是扩展winform控件,因此我们需要在项目引用中增加 WindowsFormsIntegration.dll。
然后再xmal中加入wfi的命名空间
1 | xmlns:wfi = "clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration" |
然后按照下面的方法使用即可,这种方式,对于任意的winform控件都支持。
1 2 3 | <wfi:WindowsFormsHost> <local:ExtendedWebBrowser x:Name= "Browser" Url= "www.baidu.com" ></local:ExtendedWebBrowser> </wfi:WindowsFormsHost> |
原作者:https://blog.csdn.net/wodeshijianhrf/article/details/90746142
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!