认知尚浅,如有错误,愿闻其详!
概述
我司基于.NET Core 重新开发的HIS中涉及到一个C端,一个B端,C端主要用于医生病程病历等录入,B端主要负责数据管理等。所以,为了方便起见,决定嵌入后台管理网访问浏览。最终决定使用CefSharp 的Web Browse控件(以下简称Cef)用法与介绍我就不过多赘述,需要的看一下这WinForm CefSharp 笔记一(入门篇)By YoungHappyGIS。
问题
网上看了一下Cef的用法,基本大家都是为了演示为主,然后基本都是这么写的:
以上案例中最终只会有一个主窗体,主窗体里承载着Web Browser。 一经关闭,则是全部清除。
但是在很多实际的场景中,我们往往遇到的是我再主界面,点击某个按钮,然后弹框显示Web页面。
我起初照着例子写了一份,结果出现了Bug:
第一次启动完全OK,但是关闭了Web窗口,再次点击按钮,则整个程序退出了。
解决
出现这个问题是在于多次去初始化浏览器,Cef.Initialize(settings, true, browserProcessHandler: null);
,导致程序闪退。
解决方式就是只初始化一次Cef,直到主程序退出,才执行 Cef.Shutdown();关闭浏览器;
代码如下:
1、主窗口调用初始化
//初始化浏览器并启动
public void InitializeChromium()
{
try
{
CefSettings settings = new CefSettings();
// 设置是否使用GPU
settings.CefCommandLineArgs.Add("disable-gpu", "1");
// 设置是否使用代理服务
settings.CefCommandLineArgs.Add("no-proxy-server", "1");
// 设置是否启动js交互,假如需要原生与js方法互调,则需要设置为true
CefSharpSettings.LegacyJavascriptBindingEnabled = true;
// 初始化cef
Cef.Initialize(settings, true, browserProcessHandler: null);
}
catch (Exception ex)
{
logger.WarnLog("后台管理浏览器初始化异常" , Name , "警告" , ex);
}
}
//窗口关闭
private void FrmMain_FormClosing(object sender, FormClosingEventArgs e)
{
Cef.Shutdown();
Environment.Exit(0);
}
2、点击按钮创建浏览器控件
// 创建浏览器控件
private void Frm_BackstageManageWeb_Load(object sender, EventArgs e)
{
// 创建浏览器控件
chromeBrowser = new ChromiumWebBrowser("http://192.168.110.89:8080/");
// 将控件添加到窗体
this.Controls.Add(chromeBrowser);
chromeBrowser.Dock = DockStyle.Fill;
}
//浏览器窗口关闭
private void Frm_BackstageManageWeb_FormClosing(object sender, FormClosingEventArgs e)
{
//此方法会同时关闭窗口,我们真只可以直接调用该方法,同时关闭浏览器及窗口
chromeBrowser.GetBrowser().CloseBrowser(true);//关闭浏览器
}
这样,问题就不会出现了!