摘要
在使用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#方法实现,结果不太满意,发现如果程序全屏遮盖任务的情况下,弹框只会出现在任务栏,而不会在页面上显示。造成阻塞,在页面上无法做其他的操作。