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

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

作者: Memoyu | 来源:发表于2019-12-10 13:06 被阅读0次

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

    概述

      我司基于.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嵌入网页的调用

          本文链接:https://www.haomeiwen.com/subject/hiqigctx.html