关于Winform 下CefSharp嵌入网页的调用

认知尚浅,如有错误,愿闻其详!

概述

  我司基于.NET Core 重新开发的HIS中涉及到一个C端,一个B端,C端主要用于医生病程病历等录入,B端主要负责数据管理等。所以,为了方便起见,决定嵌入后台管理网访问浏览。最终决定使用CefSharp 的Web Browse控件(以下简称Cef)用法与介绍我就不过多赘述,需要的看一下这WinForm CefSharp 笔记一(入门篇)By YoungHappyGIS。

问题

  网上看了一下Cef的用法,基本大家都是为了演示为主,然后基本都是这么写的:


Cef简单使用.png

以上案例中最终只会有一个主窗体,主窗体里承载着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);//关闭浏览器
        }

这样,问题就不会出现了!

你可能感兴趣的:(关于Winform 下CefSharp嵌入网页的调用)