Avalonia学习(十七)-CEF

今天开始继续Avalonia练习。

本节:CefNet

1.引入

CefNet.Avalonia.Eleven

2.项目引入

Program中加入

using Avalonia;
using Avalonia.ReactiveUI;
using Avalonia.Threading;
using CefNet;
using System;
using System.IO;
using System.Linq;
using System.Threading.Tasks;

namespace CefAvalonia
{
    internal sealed class Program
    {
        internal static CefAppImpl? app;
        private static DispatcherTimer? messagePump;
        private const int messagePumpDelay = 10;
        // Initialization code. Don't use any Avalonia, third-party APIs or any
        // SynchronizationContext-reliant code before AppMain is called: things aren't initialized
        // yet and stuff might break.
        [STAThread]
        public static void Main(string[] args)
        {
            string cefPath = GetProjectPath(PlatformInfo.IsMacOS);
            bool externalMessagePump = args.Contains("--external-message-pump");

            if (PlatformInfo.IsMacOS)
            {
                externalMessagePump = true;
            }

            var settings = new CefSettings();
            settings.MultiThreadedMessageLoop = !externalMessagePump;
            settings.ExternalMessagePump = externalMessagePump;
            settings.NoSandbox = true;
            settings.WindowlessRenderingEnabled = true;
            settings.LocalesDirPath = Path.Combine(cefPath, PlatformInfo.IsMacOS ? "Resources" : "locales");
            settings.ResourcesDirPath = Path.Combine(cefPath, PlatformInfo.IsMacOS ? "Resources" : "");
            settings.LogSeverity = CefLogSeverity.Warning;
            settings.UncaughtExceptionStackSize = 8;

            App.FrameworkInitialized += App_FrameworkInitialized;
            App.FrameworkShutdown += App_FrameworkShutdown;

            app = new CefAppImpl();
            app.ScheduleMessagePumpWorkCallback = OnScheduleMessagePumpWork;
            app.Initialize(cefPath, settings);
            BuildAvaloniaApp()
                .StartWithClassicDesktopLifetime(args);
        }
        private static string GetProjectPath(bool isMacOS)
        {
            return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), ".cefnet", "Release", isMacOS ? Path.Combine("cefclient.app", "Contents", "Frameworks", "Chromium Embedded Framework.framework") : "");
        }
        private static void App_FrameworkInitialized(object? sender, EventArgs e)
        {
            if (CefNetApplication.Instance.UsesExternalMessageLoop)
            {
                messagePump = new DispatcherTimer(TimeSpan.FromMilliseconds(messagePumpDelay), DispatcherPriority.Normal, (s, e) =>
                {
                    CefApi.DoMessageLoopWork();
                    Dispatcher.UIThread.RunJobs();
                });
                messagePump.Start();
            }
        }
        private static void App_FrameworkShutdown(object? sender, EventArgs e)
        {
            messagePump?.Stop();
        }

        private static async void OnScheduleMessagePumpWork(long delayMs)
        {
            await Task.Delay((int)delayMs);
            Dispatcher.UIThread.Post(CefApi.DoMessageLoopWork);
        }

        // Avalonia configuration, don't remove; also used by visual designer.
        public static AppBuilder BuildAvaloniaApp()
            => AppBuilder.Configure<App>()
                .UsePlatformDetect()
                .WithInterFont()
                .LogToTrace()
                .UseReactiveUI();
    }
}

APP中加入

using Avalonia;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Markup.Xaml;
using CefAvalonia.ViewModels;
using CefAvalonia.Views;
using System;

namespace CefAvalonia
{
    public partial class App : Application
    {
        public static event EventHandler? FrameworkInitialized;
        public static event EventHandler? FrameworkShutdown;
        public override void Initialize()
        {
            AvaloniaXamlLoader.Load(this);
        }

        public override void OnFrameworkInitializationCompleted()
        {
            if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
            {
                desktop.MainWindow = new MainWindow
                {
                    DataContext = new MainWindowViewModel(),
                };
            }

            base.OnFrameworkInitializationCompleted();
        }
    }
}

添加一个实现处理类

using CefNet;
using System;
using System.Runtime.InteropServices;

namespace CefAvalonia
{
    internal class CefAppImpl:CefNetApplication
    {
        protected override void OnBeforeCommandLineProcessing(string processType, CefCommandLine commandLine)
        {
            base.OnBeforeCommandLineProcessing(processType, commandLine);

            if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
            {
                commandLine.AppendSwitch("no-zygote");
                commandLine.AppendSwitch("no-sandbox");
            }
        }
        public Action<long> ScheduleMessagePumpWorkCallback { get; set; }

        protected override void OnScheduleMessagePumpWork(long delayMs)
        {
            ScheduleMessagePumpWorkCallback(delayMs);
        }
    }
}

窗口后台

using Avalonia.Controls;
using CefNet.Avalonia;


namespace CefAvalonia.Views
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            WebView webview = new() { Focusable = true };
            Content = webview;

            webview.BrowserCreated += (s, e) => webview.Navigate("https://www.baidu.com");

            webview.DocumentTitleChanged += (s, e) => Title = e.Title;

            Closing += (s, e) => Program.app?.Shutdown();
        }
    }
}

最后,下载对应的库

CEF Automated Builds (spotifycdn.com)

运行效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/291169.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[足式机器人]Part2 Dr. CAN学习笔记-自动控制原理Ch1-10奈奎斯特稳定性判据-Nyquist Stability Criterion

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-自动控制原理Ch1-10奈奎斯特稳定性判据-Nyquist Stability Criterion Cauchy’s Argument Priciple 柯西幅角原理 结论&#xff1a; s s s平面内顺时针画一条闭合曲线 A A A&#xff0c; B B B曲…

Python从入门到网络爬虫(函数详解)

前言 函数是变成语言中最常见的语法&#xff0c;函数的本质就是功能的封装。使用函数可以大大提高编程效率与程序的可读性。函数是能够实现特定功能的计算机代码而已&#xff0c;他是一种特定的代码组结构。 函数的作用 1.提升代码的重复利用率&#xff0c;避免重复开发相同代…

【代数学作业1-python实现GNFS一般数域筛】构造特定的整系数不可约多项式:涉及素数、模运算和优化问题

代数学作业1-完整版&#xff1a;python实现GNFS一般数域筛 写在最前面背景在GNFS算法中选择互质多项式时&#xff0c;需要考虑哪些关键因素&#xff0c;它们对算法的整体运行时间有何影响? 练习1题目题目分析Kleinjung方法简介通用数域筛法&#xff08;GNFS&#xff09;中的多…

简易机器学习笔记(七)计算机视觉基础 - 常用卷积核和简单的图片的处理

前言 这里实际上涉及到了挺多有关有关理论的东西&#xff0c;可以详细看一下paddle的官方文档。不过我这里不过多的谈有关理论的东西。 【低层视觉】低层视觉中常见的卷积核汇总 图像处理中常用的卷积核 在代码中&#xff0c;我们实际上是用不同的卷积核来造成不同的影响&a…

从零开始搭建企业级前端项目模板(vue3+vite+ts)

文章目录 主要内容一、vite脚手架工具初始化项目二、项目代码加入eslint校验和自动格式化2.1安装对应依赖插件2.2 配置script脚本&#xff0c;项目安装eslint配置2.3 安装完成后&#xff0c;后面启动项目还缺少一些依赖&#xff0c;提前按需安装好 三&#xff0c;修改eslintrc.…

达梦数据:数字化时代,国产数据库第一股终于到来?

又是新的一年开始。回首一年前的此时&#xff0c;在大家千呼万唤地期待中&#xff0c;数据基础制度体系的纲领性文件正式发布。 时隔一年之后&#xff0c;数据资源入表如约而至。2024年1月1日《企业数据资源相关会计处理暂行规定》正式施行&#xff0c;各行各业海量数据巨大的…

隔离式双向DC-DC 转换器介绍

1.前言 由于电力电子、数字控制及电池技术的进步&#xff0c;促使再生能源、储能系统及新能源应用等产业的蓬勃发展。例如 : 电动汽车的电能系统、对电力系统用电进行削峰填谷和调节电力的储能系统、应急电源及可携式行动电源等。这些设备都需要双向电力转换系统在电力系统与电…

5G阅信助力互联网行业:XX出行-出票通知,案例分析

XX出行日常有大量业务通知短信下发&#xff0c;用户触达频次和用户打开率都比较高&#xff0c;但原短信无法带来附加营销增值&#xff0c;通过阅信增值服务消息将两者结合起来&#xff0c;可实现业务的多渠道引流&#xff0c;开拓了新的渠道和方式。 项目概述&#xff1a; 1. 项…

MATLAB基本绘图操作(二维和三维绘图)

MATLAB基本绘图操作 文章目录 MATLAB基本绘图操作1、二维平面绘图1.1、线条&#xff08;折线图&#xff09;1.2、条形图1.3、极坐标图1.4、散点图 2、三维立体绘图2.1、三维曲面图2.2、三维曲线图&#xff08;点图&#xff09; 3、图片分区&#xff08;子图&#xff09; 1、二维…

机器学习:贝叶斯估计在新闻分类任务中的应用(实验报告)

文章摘要 随着互联网的普及和发展&#xff0c;大量的新闻信息涌入我们的生活。然而&#xff0c;这些新闻信息的质量参差不齐&#xff0c;有些甚至包含虚假或误导性的内容。因此&#xff0c;对新闻进行有效的分类和筛选&#xff0c;以便用户能够快速获取真实、有价值的信息&…

如何把照片多余的地方擦除?一键消除图片上的瑕疵,简单又轻松,太方便了

在数字繁荣的时代&#xff0c;图片处理已然成为我们生活乐章中不可或缺的一部分&#xff0c;就如画师手中的画笔般灵动&#xff0c;摄影师镜头下的世界般多彩。然而&#xff0c;在捕捉或获取这些美丽的图片时&#xff0c;可能会不小心闯入一些不速之客&#xff0c;给画面带来瑕…

Linux Perf 介绍

文章目录 前言 二、安装Perf三、二级命令3.1 perf list3.2 perf record/report3.3 perf stat3.4 perf top 四、使用火焰图进行性能分析4.1 下载火焰图可视化生成器4.2 使用perf采集数据4.3 生成火焰图参考资料 前言 perf是一款Linux性能分析工具&#xff0c;内置在Linux内核的…

爬虫工具(tkinter+scrapy+pyinstaller)

需求介绍输入&#xff1a;关键字文件&#xff0c;每一行数据为一爬取单元。若一行存在多个and关系的关键字 &#xff0c;则用|隔开处理&#xff1a;爬取访问6个网站的推送&#xff0c;获取推送内容的标题&#xff0c;发布时间&#xff0c;来源&#xff0c;正文第一段&#xff0…

自动化测试框架总结

1. 单元测试框架 几乎所有的主流语言&#xff0c;都会有其对应的单元测试框架,下面简单介绍一下python,java,C#三种语言的常见单元测试框架 1.1 Python python常见单元测试框架包括unittest, pytest 1.1.1 unittest unittest单元测试框架不仅可以适用于单元测试&#xff0c…

Windows重装升级Win11系统后 恢复Mysql数据

背景 因为之前电脑硬盘出现问题&#xff0c;换了盘重装了系统&#xff0c;项目的数据库全部没了&#xff0c;还好之前的Mysql是安装在的D盘里&#xff0c;还有留存文件 解决办法 1.设置环境变量 我的路径是 D:\SoftWare\Application\mysql-5.7.35-winx64 此电脑右键属性 …

auto关键字的含义以及常见用法,C++11中的关键字

一、auto关键字的含义&#xff1a; auto&#xff1a;这是 C11 引入的关键字&#xff0c;用于自动推断变量的类型&#xff1b; 二、auto关键字的常见用法&#xff1a; auto 关键字在 C 中用于自动推断变量的类型&#xff0c;它可以让编译器根据初始化表达式的类型推导出变量的…

Python 介绍和环境准备

一、概述 Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的解释性编程语言。 Python 是一种解释型语言&#xff1a; 这意味着开发过程中没有了编译这个环节。类似于PHP和Perl语言。 Python 是交互式语言&#xff1a; 这意味着&#xff0c;您可以在一个 Python…

和鲸解放军总医院连续生理数据分析引擎入选爱分析数据智能最佳实践案例

近日&#xff0c;“2023 爱分析 数据智能最佳实践案例”评选活动落下帷幕&#xff0c;和鲸科技基于旗下数据科学协同平台 ModelWhale 携手解放军总医院联合打造的《解放军总医院连续生理数据分析引擎》成功入选&#xff0c;有力证明了该案例于数据资产归集、数据架构升级、数据…

UE5.1保存资源报错

UE5.1保存资源报错 错误&#xff1a; The asset /Game/XXX(XXX.uasset) failed to save. Cancel: Stop saving all assets and return to the editor. Retry: Attempt to save the asset again. Continue: Skip saving this asset only. 解决: 1. 可能是进程中有多开的项目&…

iOS 组件开发教程——手把手轻松实现灵动岛

1、先在项目里创建一个Widget Target 2、一定要勾选 Include live Activity&#xff0c;然后输入名称&#xff0c;点击完成既可。 3、在 Info.plist 文件中声明开启&#xff0c;打开 Info.plist 文件添加 NSSupportsLiveActivities&#xff0c;并将其布尔值设置为 YES。 4、我…