• WPF内嵌CEF控件,与JS交互


    1)安装cefsharp.winform包

    打开VS2017,打开nuget,找到cefsharp.winform,安装


    问:为什么wpf程序不使用cefsharp.wpf?

    答:因为cefwpf 49版本的bug很多,而winform_cef就比较靠谱,比如在不同的输入法切换后无法输入中文

    问:那为什么不使用更高版本的cefwpf?

    答:因为要支持XP,而49版本是cef_wpf能支持XP的最高版本


    哦,业界毒瘤 ——XP和IE6


    2):平台改成x64或者x86

    因为Cefsharp没有针对AnyCpu的模式

    3)代码如下:

     public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
    
                //***这段代码很关键,而且只需执行一次即可,最好写在静态构造函数中*** //
                var settings = new CefSharp.CefSettings();
                settings.CefCommandLineArgs.Add("disable-gpu", "1");
                settings.CefCommandLineArgs.Add("force-device-scale-factor", "2");
                Cef.Initialize(settings);
                //********************************************************* //
    
                var webbrowser = new ChromiumWebBrowser("https://www.baidu.com");
    
                //为什么要用一个windowsformhost包起来,因为cef是winform的,所以在wpf下使用,必须用这个包一下
                var winform = new WindowsFormsHost()
                {
                    Child = webbrowser
                };
    
                //绑定,和js交互的关键,注册一个JsObj,这个可以自定义,然后对于js来说,第二个参数this就代表了JsObj
                webbrowser.RegisterAsyncJsObject("JsObj", this, false);
                this.Content = winform;
            }
    
            public void (object pramas)
            {
                //可以通过这种方式取得参数
                var type = pramas.GetType();
                var id=type.InvokeMember("id", System.Reflection.BindingFlags.GetProperty, null, pramas, null);
                //do something.....
                Application.Current.MainWindow.Dispatcher.BeginInvoke(new Action(() =>//报错
                {
                    //do something.....
                }));
                Dispatcher.BeginInvoke(new Action(() =>  //不会报错
                {
                    //do something.....
                }));
            }
        }

    上方代码中,display是被调方法,在执行display时,是子线程在执行,聪明的你一定想到了

    那就Application.Current.MainWindow.Dispather.BeginInvoke,但是依然会报错,为什么?

    因为在get mainwindow时依旧是操作了主线程的UI元素,所以改成下面那种方式即可

    js代码:

    <script type="text/javascript">    
            function abc()  
            {    
                JsObj.display(data);  
            }  
        </script>  



  • 相关阅读:
    领域驱动设计概览
    淘宝大秒系统设计详解
    如何设计测试用例
    MySQL性能优化
    Nginx 负载均衡
    智慧园区该怎么建设
    Docker容器完整使用教程
    C#框架结构分层
    项目验收PPT
    这么少的字,也能做出这么好看的PPT
  • 原文地址:https://www.cnblogs.com/kevinWu7/p/10163491.html
Copyright © 2020-2023  润新知