• cefsharp wpf


    github
    安装 PM> Install-Package CefSharp.Wpf
    解决方案->属性->配置属性->活动解决方案平台—新建-x64

    在需要使用的窗体上引用xmlns:cefSharp="clr-namespace:CefSharp.Wpf;assembly=CefSharp.Wpf"
    重新生成解决方案
    引用
    <cefSharp:ChromiumWebBrowser Name="browser" Grid.Row="0" Address="http://www.baidu.com" Margin="10,43,10,10"/>

    加载页面
    var value="http://cnglogs.com/ives";
    browser.Load(value);

    获取IBrowser对象,对页面的前进、后退操作需要此对象

    private IBrowser IBrowser
    {
        get
        {
            return browser.GetBrowser();
        }
    }
    
    IBrowser.GoForward();//前进
    IBrowser.Reload();//重载
    IBrowser.StopLoad();//停止
    IBrowser.GoBack();//后退
    

    加载svg
    安装:Install-Package SharpVectors -Version 1.0.0
    添加引用xmlns:svgc="http://sharpvectors.codeplex.com/svgc/"

    <Button  x:Name="btnPrev" HorizontalAlignment="Left" Width="32" Height="32" Margin="29,10,0,10"  Click="btnPrev_Click_1"  VerticalAlignment="Top">
                <svgc:SvgViewbox IsHitTestVisible="False"  Source="pack://application:,,,/resources/svg/arrow-left-2.svg"/>
    </Button>
    

    需要注意引用方式 Source="pack://application:,,,/1.svg" ,这样才能正确的引用资源。
    svg 文件的属性默认是内容,务必改为 Resource

    在同一个页面中打开链接
    CefSharp中控制弹窗的接口是 ILifeSpanHandler,对OnBeforePopup进行重写
    首先定义操作类

    public class OpenPage : ILifeSpanHandler
        {
            public bool DoClose(IWebBrowser browserControl, IBrowser browser)
            {
                return false;
            }
    
            public void OnAfterCreated(IWebBrowser browserControl, IBrowser browser)
            {
    
            }
    
            public void OnBeforeClose(IWebBrowser browserControl, IBrowser browser)
            {
    
            }
    
            public bool OnBeforePopup(IWebBrowser browserControl, IBrowser browser, IFrame frame, string targetUrl,
                string targetFrameName, WindowOpenDisposition targetDisposition, bool userGesture, IPopupFeatures popupFeatures,
                IWindowInfo windowInfo, IBrowserSettings browserSettings, ref bool noJavascriptAccess, out IWebBrowser newBrowser)
            {
                newBrowser = null;
                var chromiumWebBrowser = (ChromiumWebBrowser)browserControl;
                chromiumWebBrowser.Load(targetUrl);
                return true; //Return true to cancel the popup creation copyright by codebye.com.
            }
        }
    

    然后添加处理事件 browser.LifeSpanHandler = new OpenPage();

    wpf与js互相调用、传值
    首先创建测试类来处理前台js请求

    public class TestClass
        {
            public int testFunc(string msg="test")
            {
                MessageBox.Show($"Get msg:{msg}");
                return 1;
            }
        }
    

    将处理方法注入容器

    private void Window_Loaded(object sender, RoutedEventArgs e)
            {
                InjectMessages(); 
            }
    
            /// <summary>
            /// 注入事件消息
            /// </summary>
            public void InjectMessages()
            {
                browser.JavascriptObjectRepository.ResolveObject += (s, eve) =>
                {
                    var repo = eve.ObjectRepository;
                    if (eve.ObjectName == "TestObj")
                    {
                        repo.Register("TestObj", new TestClass(), isAsync: true, options: BindingOptions.DefaultBinder);
                    }
                };
            }
    

    在前台绑定

    <script>
                // 注入
                CefSharp.BindObjectAsync("TestObj");
                function callBackEnd(msg) {
                    TestObj.testFunc(msg).then((r) => {
                        alert("Get result:"+r);
                    })
                }
            </script>
    

    issue

    1. 无法同时给容器设置两种对齐方式(垂直对齐、水平对齐)
      会触发异常
    System.Exception:“The browser has not been initialized. Load can only be called after the underlying CEF browser is initialized (CefLifeSpanHandler::OnAfterCreated).”
    

    flash支持

    访问 http://get.adobe.com/cn/flashplayer/otherversions/ 选择“Flash Player for Other Browsers”。

    1. 将安装flash后得到的C:WindowsSysWOW64MacromedFlashpepflashplayer32_32_0_0_303.dll复制到项目目录并修改属性为复制
    2. 初始化cef的时候添加对flash的支持
    var settings = new CefSettings();
                // Set BrowserSubProcessPath based on app bitness at runtime
                settings.BrowserSubprocessPath = Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase,
                                                       Environment.Is64BitProcess ? "x64" : "x86",
                                                       "CefSharp.BrowserSubprocess.exe");
                //添加flash支持
                settings.CefCommandLineArgs["enable-system-flash"] = "1";
                settings.CefCommandLineArgs.Add("ppapi-flash-version", "32.0.0.303");
    //必须使用AppDomain.CurrentDomain.BaseDirectory拼接  
                settings.CefCommandLineArgs.Add("ppapi-flash-path", AppDomain.CurrentDomain.BaseDirectory + "Plugins\pepflashplayer32_32_0_0_303.dll");
    
                // Make sure you set performDependencyCheck false
                Cef.Initialize(settings, performDependencyCheck: false, browserProcessHandler: null);
    

    (color{red}{视频播放})

    点击阅读播放视频相关内容

  • 相关阅读:
    头条前端笔试最后一道题
    Node读取和写入json,格式化输出json
    CSS中的未定义行为,浏览器的差异(一)
    18.2.28阿里前端实习生内推面补坑
    18.2.26深信服Web实习生补坑(已拿到offer)
    MySQL Parameter '?…' has already been defined 是什么问题
    C# List<T>的 Find方法、FindLast方法、FindAll方法、FindIndex方法
    C# 对List<T>进行排序
    SQL里 asc和desc的意思
    Visual Studio同步的时候显示 team foundation 错误 系统找不到指定文件夹
  • 原文地址:https://www.cnblogs.com/ives/p/cefsharp.html
Copyright © 2020-2023  润新知