2018年4月21日,于石门。
实验目的
在自助一体机项目中使用了CefSharp组件,前方兄弟发现使用JavaScript调用Confirm弹窗的时候按钮不能显示中文,而是现实的是英文,责成我来搞定,经过一番努力问题解决。
实验步骤
1、增加一个类(JsDialogHandler.cs)重写JsDialog的接口
using System.Windows.Forms;
using CefSharp;
namespace Asm.AutoService
{
class JsDialogHandler : IJsDialogHandler
{
public void OnDialogClosed(IWebBrowser browserControl, IBrowser browser)
{
}
public bool OnJSBeforeUnload(IWebBrowser browserControl, IBrowser browser, string message, bool isReload, IJsDialogCallback callback)
{
return true;
}
public bool OnJSDialog(IWebBrowser browserControl, IBrowser browser, string originUrl, CefJsDialogType dialogType, string messageText, string defaultPromptText, IJsDialogCallback callback, ref bool suppressMessage)
{
switch (dialogType)
{
case CefJsDialogType.Alert:
MessageBox.Show(messageText, "自助一体机");
suppressMessage = true;
return false;
case 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;
}
case CefJsDialogType.Prompt:
MessageBox.Show("系统不支持prompt形式的提示框", "自助一体机");
break;
default:
break;
}
return false;
}
public void OnResetDialogState(IWebBrowser browserControl, IBrowser browser)
{
}
}
}
2、在实例化CefSharp的地方引用
/**MainForm.cs**/
private void MainForm_Load(object sender, EventArgs e)
{
/**省略部分代码**/
//创建浏览器
browser = new ChromiumWebBrowser(path)
{
//禁止右键菜单
MenuHandler = new ContextMenuHandler(),
ContextMenu = null,
//控制窗口弹出方式
LifeSpanHandler = new LifeSpanHandler(),
//重写弹窗
JsDialogHandler = new JsDialogHandler()
};
/**省略部分代码**/
}
3、其它可能会影响的修改
经过试验1~2两步完成后就解决了当前问题,但是在原有代码中缺少中文环境相关支持的设定,这里索性也都加上。
/**MainForm.cs**/
/// <summary>
/// 初始化浏览器设置
/// </summary>
private void InitChrominum()
{
var setting = new CefSettings
{
LogSeverity = LogSeverity.Verbose,
Locale = "zh-CN",
AcceptLanguageList = "zh-CN"
};
Cef.Initialize(setting);
}