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