[Winform]Cefsharp重写alert与confirm弹窗

摘要

在使用winform内嵌cefsharp浏览本地页面的时候,如果出现alert弹窗,会在标题栏显示页面所在目录。所以想起来重写alert的样式,通过winform的MessageBox进行提示。

解决办法

这里有必要提一下,使用的cefsharp版本,因为不同的版本,参数有所变化。

cefsharp:57.0.0.0

添加类JsDialogHandler,实现接口CefSharp.IJsDialogHandler

   class JsDialogHandler : CefSharp.IJsDialogHandler
    {

        public void OnDialogClosed(CefSharp.IWebBrowser browserControl, CefSharp.IBrowser browser)
        {

        }

        public bool OnJSBeforeUnload(CefSharp.IWebBrowser browserControl, CefSharp.IBrowser browser, string message,
bool isReload, CefSharp.IJsDialogCallback callback) { return true; } public bool OnJSDialog(CefSharp.IWebBrowser browserControl, CefSharp.IBrowser browser,
string originUrl, CefSharp.CefJsDialogType dialogType, string messageText, string defaultPromptText,
CefSharp.IJsDialogCallback callback, ref bool suppressMessage) { switch (dialogType) { case CefSharp.CefJsDialogType.Alert: MessageBox.Show(messageText, "提示"); suppressMessage = true; return false; case CefSharp.CefJsDialogType.Confirm: var dr = MessageBox.Show(messageText, "提示", MessageBoxButtons.YesNo); if (dr == DialogResult.Yes) { callback.Continue(true, string.Empty); suppressMessage = false; return true; } else { callback.Continue(false, string.Empty); suppressMessage = false; return true; } break; case CefSharp.CefJsDialogType.Prompt: MessageBox.Show("系统不支持prompt形式的提示框", "提示"); break; default: break; } return false; } public void OnResetDialogState(CefSharp.IWebBrowser browserControl, CefSharp.IBrowser browser) { } }

初始化browser时,将自定义的弹窗注册上

  _browser = new CefSharp.WinForms.ChromiumWebBrowser(url)
                        {
                            BrowserSettings =
                            {
                                DefaultEncoding = "UTF-8"
                            },
                            MenuHandler = new MenuHandler(),
                            LifeSpanHandler = new OpenPageSelf(),
                            JsDialogHandler = new JsDialogHandler(),
                            Dock = DockStyle.Fill,
                        };

测试

总结

之前通过js调用c#方法实现,结果不太满意,发现如果程序全屏遮盖任务的情况下,弹框只会出现在任务栏,而不会在页面上显示。造成阻塞,在页面上无法做其他的操作。

原文地址:https://www.cnblogs.com/wolf-sun/p/7405761.html