1、實現ILifeSpanHandler介面,為了支持帶type="POST" target="_blank"的鏈接,並且為了後面能夠獲取到ChromiumWebBrowser並釋放舊的ChromiumWebBrowser,新窗體還是要讓它彈的,只不過後面會隱藏它,代碼如下: using CefSh ...
1、實現ILifeSpanHandler介面,為了支持帶type="POST" target="_blank"的鏈接,並且為了後面能夠獲取到ChromiumWebBrowser並釋放舊的ChromiumWebBrowser,新窗體還是要讓它彈的,只不過後面會隱藏它,代碼如下:
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using CefSharp; using CefSharp.WinForms; using System; using System.Collections.Generic; using System.Linq; 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; ExtChromiumBrowser extBrowser = new ExtChromiumBrowser(targetUrl) { Dock = DockStyle.Fill }; var windowX = windowInfo.X; var windowY = windowInfo.Y; var windowWidth = (windowInfo.Width == int.MinValue) ? 600 : windowInfo.Width; var windowHeight = (windowInfo.Height == int.MinValue) ? 800 : windowInfo.Height; chromiumWebBrowser.Invoke(new Action(() => { var popup = new Form { Left = windowX, Top = windowY, Width = windowWidth, Height = windowHeight, Text = targetFrameName }; popup.CreateControl(); var control = new Control(); control.Dock = DockStyle.Fill; control.CreateControl(); popup.Controls.Add(control); popup.Show(); var rect = control.ClientRectangle; windowInfo.SetAsChild(control.Handle, rect.Left, rect.Top, rect.Right, rect.Bottom); NewWindowEventArgs e = new NewWindowEventArgs(extBrowser, targetUrl, popup); chromiumWebBrowser.OnNewWindow(e); })); newBrowser = null; return false; } } }View Code
2、使用ILifeSpanHandler介面:
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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("about:_blank") { this.LifeSpanHandler = new CefLifeSpanHandler(); this.DownloadHandler = new DownloadHandler(this); } public ExtChromiumBrowser(string adress) : base(adress) { 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:
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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 ExtChromiumBrowser _browser; public ExtChromiumBrowser Browser { get { return _browser; } set { value = _browser; } } private string _url; public string Url { get { return _url; } set { value = _url; } } private Form _form; public Form Form { get { return _form; } set { value = _form; } } public NewWindowEventArgs(ExtChromiumBrowser browser, string url, Form form) { _url = url; _browser = browser; _form = form; } } }View Code
4、實現StartNewWindow,在StartNewWindow事件中做了三件事,一是替換掉舊的ChromiumWebBrowser,二是釋放掉舊的ChromiumWebBrowser,三是隱藏彈出的新窗體,實際效果可能會看到Windows任務欄的圖標會閃一下消失,那就是彈出的新窗體被隱藏了。這個實現方法比較變態,但是如果不讓新窗體彈出,就不支持帶type="POST" target="_blank"的鏈接,因為沒有把數據POST到伺服器,如果讓新窗體彈出,但是使用新窗體中的Control作為Child,而不new一個新的ChromiumWebBrowser,那麼找不到新ChromiumWebBrowser,雖然它可以正常顯示,但獲取不到它,後面無法釋放。
![](http://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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) => { this.Dispatcher.BeginInvoke(new Action(() => { _browser = e.Browser; BindBrowser(e.Browser); host.Child = e.Browser; e.Browser.FrameLoadStart += (ss, ee) => { this.Dispatcher.BeginInvoke(new Action(() => { (ss as ExtChromiumBrowser).Focus(); })); }; e.Form.Visible = false; Task.Factory.StartNew(() => { Thread.Sleep(1000); this.Dispatcher.BeginInvoke(new Action(() => { e.Form.Dispose(); browser.Dispose(); })); }); })); }; }View Code