• CefSharp禁止弹出新窗体,在同一窗口打开链接,并且支持带type="POST" target="_blank"的链接


    1、实现ILifeSpanHandler接口,代码如下:

    using CefSharp;
    using CefSharp.WinForms;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.InteropServices;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace MyBrowser
    {
        public class CefLifeSpanHandler : CefSharp.ILifeSpanHandler
        {
            public CefLifeSpanHandler()
            {
    
            }
    
            public bool DoClose(IWebBrowser browserControl, CefSharp.IBrowser browser)
            {
                if (browser.IsDisposed || browser.IsPopup)
                {
                    return false;
                }
    
                return true;
            }
    
            public void OnAfterCreated(IWebBrowser browserControl, IBrowser browser)
            {
    
            }
    
            public void OnBeforeClose(IWebBrowser browserControl, IBrowser browser)
            {
            }
    
            public bool OnBeforePopup(IWebBrowser browserControl, IBrowser browser, IFrame frame, string targetUrl, string targetFrameName, WindowOpenDisposition targetDisposition, bool userGesture, IWindowInfo windowInfo, ref bool noJavascriptAccess, out IWebBrowser newBrowser)
            {
                var chromiumWebBrowser = (ExtChromiumBrowser)browserControl;
    
                chromiumWebBrowser.Invoke(new Action(() =>
                {
                    NewWindowEventArgs e = new NewWindowEventArgs(windowInfo);
                    chromiumWebBrowser.OnNewWindow(e);
                }));
    
                newBrowser = null;
                return false;
            }
    
        }
    }
    View Code

    2、使用ILifeSpanHandler接口:

    using CefSharp.WinForms;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms.Integration;
    
    namespace MyBrowser
    {
        public class ExtChromiumBrowser : ChromiumWebBrowser
        {
            public ExtChromiumBrowser()
                : base(null)
            {
                this.LifeSpanHandler = new CefLifeSpanHandler();
                this.DownloadHandler = new DownloadHandler(this);
            }
    
            public event EventHandler<NewWindowEventArgs> StartNewWindow;
    
            public void OnNewWindow(NewWindowEventArgs e)
            {
                if (StartNewWindow != null)
                {
                    StartNewWindow(this, e);
                }
            }
        }
    }
    View Code

    3、定义NewWindowEventArgs:

    using CefSharp;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    
    namespace MyBrowser
    {
        public class NewWindowEventArgs : EventArgs
        {
            private IWindowInfo _windowInfo;
            public IWindowInfo WindowInfo
            {
                get { return _windowInfo; }
                set { value = _windowInfo; }
            }
    
            public NewWindowEventArgs(IWindowInfo windowInfo)
            {
                _windowInfo = windowInfo;
            }
        }
    }
    View Code

    4、实现StartNewWindow:

    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        _browser = new ExtChromiumBrowser() { Dock = DockStyle.Fill };
        BindBrowser(_browser);
        _browser.FrameLoadEnd += FrameLoadEnd;
        _browser.Load(_tokenUrl);
        host.Child = _browser;
    }
    
    private void BindBrowser(ExtChromiumBrowser browser)
    {
        browser.StartNewWindow += (s, e) =>
        {
            var control = new System.Windows.Forms.Control();
            control.Dock = DockStyle.Fill;
            control.CreateControl();
            host.Child = control;
            control.Focus();
    
            e.WindowInfo.SetAsChild(control.Handle, 0, 0, (int)host.ActualWidth, (int)host.ActualHeight);
        };
        browser.FrameLoadStart += (ss, ee) =>
        {
            this.Dispatcher.BeginInvoke(new Action(() =>
            {
                (ss as ExtChromiumBrowser).Focus();
            }));
        };
    }
    View Code
  • 相关阅读:
    为网站设置自定义404错误页面
    iOS核心动画
    Java 匿名内部类的示例介绍
    理解SimpleExpandableListAdapter的构造函数
    Android 控件之Spinner
    ExpandableListView 和 ExpandableListActivity的使用及数据更新
    Android中 RatingBar评分条的使用
    IHttphandler之Url重写
    DOTA版设计模式——开篇
    IHttphandler之图片水印
  • 原文地址:https://www.cnblogs.com/s0611163/p/7716692.html
Copyright © 2020-2023  润新知