在wpf中使用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

下面是整個擴展項目的類圖:

  1. 其中ExtendWebBrowser繼承至winform的控件WebBrowser,以及我們自定義用來描述webbrowser事件的接口IWebBrowserEvent。
  2. ExtendedWebBrowserExtension類我主要是用來擴展WebBrowser,現在已經實現的功能有:根據url獲取或者設置cookie,清理cookie,session。
  3. DWebBrowserEvents2 接口描述了我們需要擴展的事件,當前項目只是擴展了其中的部分事件,即WebBrowserExtendedEvents中觸發的事件。更多支持的事件可以看微軟的官方文檔:https://docs.microsoft.com/en-us/dotnet/api/shdocvw.dwebbrowserevents2?view=dynamics-usd-3

如何給ExtendWebBrowser擴展DWebBrowserEvents2支持的事件

我們以DownloadBegin事件爲例.總共分爲3步:

[ComImport, Guid("34A715A0-6587-11D0-924A-0020AFC7AC4D"), InterfaceType(ComInterfaceType.InterfaceIsIDispatch), TypeLibType(TypeLibTypeFlags.FHidden)]
public interface DWebBrowserEvents2
{
    //。。。省略之前的事件
    [System.Runtime.InteropServices.DispId(106)]
    public void DownloadBegin ();
}
  • ExtendedWebBrowser與IWebBrowserEvent中增加想向外暴露的事件。
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());
        }
    }
}
  • WebBrowserExtendedEvents 進行中轉事件。
public class WebBrowserExtendedEvents : StandardOleMarshalObject, DWebBrowserEvents2
{
    //。。。
    //。。。
    public void DownloadBegin ()
    {
        _Browser.OnDownloadBegin();
    }
}

在wpf中使用ExtendWebBrowser

ExtendWebBrowser是擴展winform控件,因此我們需要在項目引用中增加 WindowsFormsIntegration.dll。

然後再xmal中加入wfi的命名空間

 xmlns:wfi ="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"

然後按照下面的方法使用即可,這種方式,對於任意的winform控件都支持。

<wfi:WindowsFormsHost>
    <local:ExtendedWebBrowser x:Name="Browser" Url="www.baidu.com"></local:ExtendedWebBrowser>
</wfi:WindowsFormsHost>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章