zoukankan      html  css  js  c++  java
  • 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}{视频播放})

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

  • 相关阅读:
    HLG 1522 子序列的和【队列的应用】
    POJ 3273 Monthly Expense【二分】
    HDU 4004 The Frog's Games 【二分】
    POJ 2001 Shortest Prefixes【第一棵字典树】
    POJ 2823 Sliding Window【单调对列经典题目】
    HDU 1969 Pie 【二分】
    POJ 3125 Printer Queue【暴力模拟】
    POJ 3250 Bad Hair Day【单调栈】
    字典树【模板】
    验证码 Code
  • 原文地址:https://www.cnblogs.com/ives/p/cefsharp.html
Copyright © 2011-2022 走看看