Processing math: 100%

cefsharp wpf wpf加载svg

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
在新版本中只需要写直接访问的路径即可
<svgc:SvgViewbox Source="../../Resources/RIGHT.svg"/>

在同一个页面中打开链接
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:\Windows\SysWOW64\Macromed\Flash\pepflashplayer32_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}{视频播放}\)

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

posted @   Hey,Coder!  阅读(1974)  评论(0编辑  收藏  举报
编辑推荐:
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
· AI与.NET技术实操系列:使用Catalyst进行自然语言处理
· 分享一个我遇到过的“量子力学”级别的BUG。
阅读排行:
· dotnet 源代码生成器分析器入门
· 官方的 MCP C# SDK:csharp-sdk
· 从零开始:基于 PyTorch 的图像分类模型
· [WPF] 在RichTextBox中输出Microsoft.Extension.Logging库的
· 一步一步教你部署ktransformers,大内存单显卡用上Deepseek-R1
点击右上角即可分享
微信分享提示