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)

运行效果

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

边坡安全监测预警系统——高效率

安装边坡安全监测预警系统的原因是多方面的&#xff0c;涉及到社会效益、经济效益和环境效益。随着国家基础设施建设的快速发展&#xff0c;边坡安全监测预警系统的需求越来越迫切。 边坡安全监测预警系统对于保障人民生命财产安全具有重要意义。在山区、丘陵地带&#xff0c;边…

苹果Vision Pro将于1月27日上市!

在无数期待中&#xff0c;苹果全新产品Vision Pro头显终于定下上市日期。 彭博社记者马克古曼&#xff08;Mark Gurman&#xff09;于近日在X&#xff08;前推特&#xff09;平台爆料了这一信息&#xff0c;预计苹果Vision Pro头显将于2024年1月27日率先在美国上市。 在过去看…

【观察】Aginode安捷诺:坚守“长期主义”,服务中国数字经济

毫无疑问&#xff0c;随着整个社会加速数字化转型&#xff0c;尤其是5G、人工智能、大数据等技术兴起&#xff0c;以及智慧医疗、智慧金融、智能制造等应用加速落地&#xff0c;算力网络在经济社会发展中扮演了愈来愈重要的角色&#xff0c;成为支撑数字经济蓬勃发展的“新引擎…

移动神器RAX3000M路由器变身家庭云之四:开放LuCI管理界面,网站服务

前面已经改造成了家庭云供外网访问了。由于这个路由本来就是openwrt&#xff0c;openwrt本身的管理界面LuCI-admin很好用&#xff0c;但被屏蔽了&#xff0c;需要打开。 打开界面 ssh登录路由器&#xff0c;修改 /etc/config/uhttpd配置文件如下&#xff1a; config uhttpd …

深入浅出Prometheus架构原理

目录 1 Prometheus简介 2 Prometheus 的优势 2.1 Prometheus 适用于什么场景 2.2 Prometheus 不适合什么场景 3 Prometheus 的架构 4 Prometheus 的组件 4.1 组件介绍 4.1.1 Prometheus Server 4.1.2 Exporter 4.1.3 Push Gateway 4.1.4 Grafana 4.1.5 Alert…

elasticsearch的查询方式和数据库事务隔离级别的思考

项目中用到了 elasticsearch&#xff0c;发现有几种查询方式不太一样&#xff0c;思考了一下&#xff0c;总结如下 普通分页 等同于关系数据库的分页查询&#xff0c;例如 mysql 的 limit&#xff0c;如下 sql select * from test limit 100000,10 这种查询方式有一个问题&a…

PyQt 多线程多进程研究

杰哥&#xff0c;PyQT系统界面卡顿的问题是因为检测图片的耗时太长了&#xff0c;大概一张图片四十多秒。如果用多线程来解决耗时几秒的任务&#xff0c;是可以在之前卡顿问题上进一步解决的。但是不能解决像我们这种超长耗时的任务的&#xff0c;只能利用多线程来避免。我尝试…

计算机网络知识点

1. URI 和 URL 统一资源定位符&#xff08;Uniform Resource Locator&#xff0c;缩写&#xff1a;URL&#xff09;&#xff0c;是对资源的引用和访问该资源的方法。俗称网址&#xff0c;就是浏览器地址栏里面的内容。 URL 语法为&#xff1a;protocol://userInfohost:port/p…

大数据 - Doris系列《一》- Doris简介

目录 &#x1f436;1.1 Doris 概述 &#x1f436;1.2 OLAP和OLTP&#xff08;面试&#xff09; 1. 应用场景 &#x1f959;联机事务处理OLTP(On-Line Transaction Processing) &#x1f959;联机分析处理OLAP(On-Line Analytical Processing) 2. OLAP和OLTP比较--“用户行…

自建代码托管平台 GitLab 安装指南

目录 前言1 GitLab简介2 安装服务器准备2.1 选择适合的操作系统2.2 网络设置2.3 SSH 连接 3 安装包准备3.1 获取 GitLab CE 安装包3.2 查阅官方文档 4 配置运行脚本4.1 创建安装脚本4.2 赋予执行权限4.3 执行安装脚本4.4 验证 GitLab 安装 5 初始化 GitLab 服务6 启动 GitLab 服…

实验笔记之——下载数据到服务器

开发过程中经常需要把数据传到服务器上&#xff0c;太麻烦了&#xff0c;为此本博文记录采用百度云来传输数据 百度云 使用bypy包。 安装&#xff1a;pip install bypy 配置bypy连接百度网盘&#xff1a; 终端输入bypy info将命令行提示的链接复制到浏览器&#xff0c;并复制…

【Java】log4j和slf4j区别

log4j&#xff1a;Apache Software Foundation 开源 slf4j&#xff1a;不支持日志滚动等高级功能 在开源库或内部库中使用 SLF4J&#xff0c;将使其独立于任何特定的日志记录实现&#xff0c;这意味着无需为多个库管理多个日志记录配置&#xff0c;您的客户端将会很需要这一点…