解决WPF+Avalonia在openKylin系统下默认字体问题
一、openKylin简介
openKylin(开放麒麟) 社区是在开源、自愿、平等和协作的基础上,由基础软硬件企业、非营利性组织、社团组织、高等院校、科研机构和个人开发者共同创立的一个开源社区,致力于通过开源、开放的社区合作,构建桌面操作系统开源社区,推动Linux开源技术及其软硬件生态繁荣发展。
“开放麒麟”(openKylin)是中国首个桌面操作系统开发者平台,由国家工业信息安全发展研究中心等单位联合成立,通过开放操作系统源代码的方式打造具有自主创新技术的开源桌面操作系统。
系统镜像下载地址:https://www.openkylin.top/downloads/index-cn.html
二、Avalonia简介(https://avaloniaui.net/)
Avalonia是一个跨平台的.NET框架,用于构建漂亮、现代的图形用户界面(GUI)。
使用Avalonia,您可以从单个代码库创建适用于Windows、macOS、 Linux、iOS、Android和Web Assembly的原生应用程序。
Avalonia兼容所有支持.NET Standard 2.0的平台。
Avalonia官方支持下列平台:
-
Windows 8 及更高版本(虽然它也能在Windows 7上正常工作)
-
macOS High Sierra 10.13 及更高版本
在Linux上,下列发行版支持Avalonia:
-
Debian 9 (Stretch) 及更高版本
-
Ubuntu 16.04 及更高版本
-
Fedora 30 及更高版本
Avalonia11版本的中文官方文档地址:https://docs.avaloniaui.net/zh-Hans/docs/next/welcome
随着信创、操作系统国产化替换的推广进程,一些客户端项目也会有需要转移到Linux桌面的巨大的市场需求。
目前Linux下桌面程序开发的常见工具的有:QT、Electron、Blazor。而现在WPF有了Avalonia的加持,势必会在开发原生跨平台应用时更具有优势和性价比。
三、VS2022安装Avalonia开发插件
首先要安装visual studio2022的开发工具,然后在顶部菜单==>扩展中打开管理扩展,安装以下两个插件(注意版本)。
四、openKylin安装.NET Core环境
在openKylin官方网站上下载镜像后,可用虚拟机进行安装,安装后进入到桌面,然后根据微软官方安装教程:https://learn.microsoft.com/zh-cn/dotnet/core/install/linux通过脚本或者下载手动安装的方法进行安装.NET Core环境。
需要注意的是,openKylin建立的登录账户不具备root权限,所以在安装完成后需要配置以下环境变量,否则运行dotnet时会提示没有这个命令提示。
具体方法是打开一个终端,然后输入
sudo -s
输入密码回车,然后终端会变成root权限的终端,接着输入下面命令后回车
vim /etc/profile
会打开一个编辑界面,我们按键盘的i键进入编辑模式,然后到文档最后插入一行,输入安装完.NET Core环境后提示的PATH路径,比如:
exprot PATH=$PATH:/home/操作系统登录名/.dotnet
然后按esc,输入:wq回车,保存退出。随后重启OpenKylin系统,重启后进入到桌面,打开终端,输入
dotnet --info
回车,看到.NET Core的输出信息,证明安装和配置.NET Core环境没有问题。
五、使用VS2022建立Avalonia桌面项目
在安装完Avalonia插件和模板后,我们在创建新的项目的时候,可以直接搜索avalonia关键字,直接创建一个Avalonia C# Project,会有创建向导,按照向导提示一步一步创建完毕。
点击Create按钮后,稍等片刻即可完成项目创建,我们把创建的带Desktop结尾的项目设置为启动项目,然后我们直接F5运行项目,没有意外的话会看到一个界面,一句英文提示。
六、解决Avalonia桌面项目在openKylin下报Default font name can't be null or empty的问题
我们把ViewModels\MainViewModel.cs把英文的文字改成中英混合的文字。
public string Greeting => "欢迎使用 Avalonia!";
点击顶部菜单的生成==>发布选定内容,目标运行时选linux-x64,然后发布项目。
发布成功后,我们把项目复制粘贴到openKylin的环境下,然后在终端中定位到项目目录,运行
dotnet StudyAvalonia.Desktop.dll
会看到经典的 Default font name can't be null or empty. 的错误提示:
可见目前它对中文Linux系统的默认字体支持不太好,有的解决办法是给操作系统设置为英文,但我们国产系统目标群体绝大部分都需要使用中文环境。因此我们在开发项目时自己指定一下项目要用的默认字体来解决这个问题。
这里我们选用阿里巴巴的免费可商用的字体==>阿里巴巴普惠体:https://www.alibabafonts.com/#/font
下载后按照下面目录结构放入字体文件(也可自定义其它路径,只要代码中的路径做出对应调整即可)
这里记得把字体文件设置为AvaloniaResource
然后在Desktop项目中新建两个类文件
FontSettings.cs
public class FontSettings
{public string DefaultFontFamily = "fonts:MyDesignFontFamilies#Alibaba PuHuiTi 2.0";public Uri Key { get; set; } = new Uri("fonts:MyDesignFontFamilies", UriKind.Absolute);public Uri Source { get; set; } = new Uri("avares://StudyAvalonia.Desktop/Assets/Fonts/AliBaba", UriKind.Absolute);
}
AvaloniaAppBuilderExtensions.cs
public static class AvaloniaAppBuilderExtensions
{public static AppBuilder UseFontAlibaba([DisallowNull] this AppBuilder builder, Action<FontSettings>? configDelegate = default){var setting = new FontSettings();configDelegate?.Invoke(setting);return builder.With(new FontManagerOptions{DefaultFamilyName = setting.DefaultFontFamily,FontFallbacks = new[]{new FontFallback{FontFamily = new FontFamily(setting.DefaultFontFamily)}}}).ConfigureFonts(manager => manager.AddFontCollection(new EmbeddedFontCollection(setting.Key, setting.Source)));}
}
在Program.cs中注册一下新建的AppBuilder(.UseFontAlibaba())
class Program
{// 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) => BuildAvaloniaApp().StartWithClassicDesktopLifetime(args);// Avalonia configuration, don't remove; also used by visual designer.public static AppBuilder BuildAvaloniaApp()=> AppBuilder.Configure<App>().UsePlatformDetect().UseFontAlibaba().WithInterFont().LogToTrace().UseReactiveUI();
}
然后在编译发布项目,复制到OpenKylin系统中,重新运行,就可以看到可以正常的跑起来了,界面显示中文没有问题了。
七、鸣谢:
https://www.raokun.top/archives/ru-he-zai-avalonia11-zhong-she-zhi-zi-ding-yi-zi-ti
https://github.com/MicroSugarDeveloperOrg/AntDesign.Avalonia
八、转载请注明来源:https://blog.csdn.net/wdw984/article/details/133575207
相关文章:

解决WPF+Avalonia在openKylin系统下默认字体问题
一、openKylin简介 openKylin(开放麒麟) 社区是在开源、自愿、平等和协作的基础上,由基础软硬件企业、非营利性组织、社团组织、高等院校、科研机构和个人开发者共同创立的一个开源社区,致力于通过开源、开放的社区合作ÿ…...

智能合约漏洞,Dyna 事件分析
智能合约漏洞,Dyna 事件分析 1. 漏洞简介 https://twitter.com/BlockSecTeam/status/1628319536117153794 https://twitter.com/BeosinAlert/status/1628301635834486784 2. 相关地址或交易 攻击交易 1: https://bscscan.com/tx/0x7fa89d869fd1b89e…...
Elasticsearch基础篇(四):Elasticsearch7.x的官方文档学习(Set up Elasticsearch)
Set up Elasticsearch 1 Configuring Elasticsearch(配置 Elasticsearch)1.1 Setting JVM Options(设置JVM选项)1.2 Secure Settings(安全设置)Introduction(介绍)Using the Keystore(使用密钥库)Applying Changes(应用更改)Reloadable Secure Settings(可重新加载的安全设置)R…...

二叉树的遍历方式和代码
二叉树的三种遍历和代码 1.前序遍历2.中序遍历3.后序遍历4.三种遍历方式的代码实现 1.前序遍历 学习二叉树结构,最简单的方式就是遍历。所谓遍历(Traversal)是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问。访问结点所做的操作依赖于具…...

小样本学习——匹配网络
目录 匹配网络 (1)简单介绍: (2)专业术语 (3)主要思想 (4)训练过程 问题 回答 MANN 匹配网络 (1)简单介绍: Matching netwo…...
CSS 常用样式 之字体属性
font-weight(字体粗细) 字体粗细用于设置文本的粗细程度,可以使用如下的值: normal:正常字体(默认)bold:加粗字体bolder:更加加粗lighter:更加细 代码实例…...

nodejs+vue游戏测评交流系统elementui
可以实现首页、发布招募、公司资讯、我的等,另一方面来说也可以提高在游戏测评交流方面的效率给相关管理人员的工作带来一定的便利。在我的页面可以对游戏攻略、我的收藏管理、实际上如今信息化成为一个未来的趋势或者可以说在当前现代化的城市典范中,发布招募等功能…...
1.2.OpenCV技能树--第一单元--OpenCV安装
目录 1.文章内容来源 2.OpenCV安装 3.课后习题代码复现 4.易错点总结与反思 1.文章内容来源 1.题目来源:https://edu.csdn.net/skill/opencv/opencv-662dbd65c89d4ddb9e392f44ffe16e1a?category657 2.资料来源:https://edu.csdn.net/skill/opencv/opencv-662dbd65c89d4ddb…...

全志ARM926 Melis2.0系统的开发指引⑥
全志ARM926 Melis2.0系统的开发指引⑥ 编写目的9. 系统启动流程9.1. Shell 部分9.2.Orange 和 desktop 部分9.3. app_root 加载部分9.4. home 加载部分 10. 显示相关知识概述10.1. 总体结构10.2. 显示过程10.3. 显示宽高参数关系 -. 全志相关工具和资源-.1 全志固件镜像修改工具…...

Junit单元测试为什么不能有返回值?
这个问题的产生来源于我们老师上节课说的我们班一个男生问他的想法,刚开始听到这个还觉得挺有意思,我之前使用单元测试好像下意识的就将它的返回值写为void,一般都是进行简单的测试,也从没思考过在某个单元测试中调用另一个单元测试ÿ…...

【成像光敏描记图提取和处理】成像-光电容积描记-提取-脉搏率-估计(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

Ubuntu无法引导启动的修复
TLDR:使用Boot-Repair工具。 Boot-Repair Boot-Repair是一个简单的工具,用于修复您在Ubuntu中可能遇到的常见启动问题,例如在安装Windows或其他Linux发行版后无法启动Ubuntu时,或者在安装Ubuntu后无法启动Windows时,…...
Windows电脑上的多开软件是否安全?
在Windows电脑上使用多开软件可以让使用者同时运行多个相同或不同的程序,这对于某些需要同时操作多个账号或实例的用户来说非常有用。但是很多人担心使用多开软件是否安全。 多开软件的安全问题主要在于它们可能会破坏操作系统的稳定性和安全性,导致系统…...

U盘支持启动区+文件存储区的分区方法
准备新U盘 启动diskgenius ,先建立一个主分区(7G),剩余空间建立为第二分区,然后设定第二分区激活。 diskgenius格式化 用diskgenius格式化,在格式化的过程中有一个 写入dos系统的选项,在格式…...

JavaEE-线程进阶
模拟实现一个定时器 运行结果如下: 上述模拟定时器的全部代码: import java.util.PriorityQueue;//创建一个类,用来描述定时器中的一个任务 class MyTimerTask implements Comparable<MyTimerTask> {//任务执行时间private long …...

【开发篇】十五、Spring Task实现定时任务
文章目录 1、使用示例2、相关配置3、Scheduled注解4、Spring Task单线程下的阻塞坑5、Spring Task阻塞问题的处理思路6、Spring Task在分布式环境中 上一篇用Quartz来实现了定时任务,但相对来说,这个框架还是比较繁琐。Spring Boot默认在无任何第三方依赖…...

Python常用功能的标准代码
后台运行并保存log 1 2 3 4 5 6 7 8 9 nohup python -u test.py > test.log 2>&1 & #最后的&表示后台运行 #2 输出错误信息到提示符窗口 #1 表示输出信息到提示符窗口, 1前面的&注意添加, 否则还会创建一个名为1的文件 #最后会把日志文件输出到test.log文…...

Electron.js入门-构建第一个聊天应用程序
什么是electron 电子是一个开源框架,用于使用web技术构建跨平台桌面应用程序;即: HTML、CSS和JavaScript;被集成为节点模块,我们可以为我们的应用程序使用节点的所有功能;组件,如数据库、Api休…...
ubuntu 22.04 更新NVIDIA显卡驱动,重启后无网络图标等系统奇奇怪怪问题
环境 win10, ubuntu 22.04双系统 笔记本电脑,4060显卡 解决思路 具体的过程当时没有记录下来,然后因为在解决系统的问题,也没有截图啥的,只有一些大概记忆,供未来的自己参考吧。 首先是更新显卡驱动 我是直接在soft…...

Python综合案例:学生管理系统
目录 需求说明: 功能: 创建入口函数: 实现菜单函数: 实现增删查操作: 1. 新增学生 2. 展示学生 3. 查找学生 4. 删除学生 加入存档读档: 1. 约定存档格式 2. 实现存档函数 3. 实现读档函数 打…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...

C# 表达式和运算符(求值顺序)
求值顺序 表达式可以由许多嵌套的子表达式构成。子表达式的求值顺序可以使表达式的最终值发生 变化。 例如,已知表达式3*52,依照子表达式的求值顺序,有两种可能的结果,如图9-3所示。 如果乘法先执行,结果是17。如果5…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...