解决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

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

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

相关文章

【MySQL】索引特性

目录 MySQL索引特性 索引的概念 认识磁盘 磁盘的结构 磁盘的随机访问&#xff08;Random Access&#xff09;与连续访问&#xff08;Sequential Access&#xff09; MySQL与磁盘交互的基本单位 索引的理解 观察主键索引现象 推导主键索引结构的构建 索引结构可以采用…

IPSG技术和IP组播

1&#xff0c;IPSG技术概述 实验&#xff1a; DHCP snooping IPSG 拓扑&#xff1a; 需求&#xff1a; 1&#xff0c;实现PC1 和PC2 动态获取IP地址 2, 在SW2 配置DHCP snooping 实现DHCP 服务器的安全 3, 在 连接PC 1 和 PC2 的 接口上 做IPSG &#xff0c;防止终端…

贪心算法+练习

正值国庆之际&#xff0c;祝愿祖国繁荣昌盛&#xff0c;祝愿朋友一生平安&#xff01;终身学习&#xff0c;奋斗不息&#xff01; 目录 1.贪心算法简介 2.贪心算法的特点 3.如何学习贪心算法 题目练习&#xff08;持续更新&#xff09; 1.柠檬水找零&#xff08;easy&…

​苹果应用高版本出现:“无法安装此app,因为无法验证其完整性”是怎么回事?竟然是错误的?

最近经常有同学私聊我问苹果应用签名后用落地页下载出现高版本是什么意思&#xff1f;我一脸懵&#xff01;还有这个操作&#xff1f;高版本是个啥玩意&#xff01;所以我就上了一下科技去搜索引擎搜索了下&#xff0c;哈哈哈&#xff0c;然后了解下来发现是这样的首先我们确定…

Kubernetes安装部署 1

本文主要描述kubernetes的安装部署&#xff0c;kubernetes的安装部署主要包括三个关键组件&#xff0c;其中&#xff0c;包括kubeadm、kubelet、kubectl&#xff0c;这三个组件的功能描述如下所示&#xff1a; Kubeadm 用于启动与管理kubernetes集群 Kubelet 运行在所有集群的…

Mac版快速切换工具:One Switch中文 for mac

One Switch是一款功能强大、体验极简的Mac菜单栏工具&#xff0c;适合需要频繁切换系统设置和启动应用程序的用户使用。通过它&#xff0c;用户可以更方便地完成日常操作&#xff0c;提高工作效率。 快速访问工具&#xff1a;One Switch提供了一个便捷的菜单栏图标&#xff0c;…

nodejs+vue晨拾酒馆管理系统elementui

晨拾酒馆管理系统&#xff0c;主要的模块包括管理员&#xff1b;系统首页、个人中心、用户管理、图书分类管理、图书信息管理、图书借阅管理、图书归还管理、图书入库管理、热门图书管理、论坛管理、系统管理&#xff0c;用户&#xff1b;系统首页、个人中心、图书借阅管理、图…

数据科学最佳实践:Kedro 的工程化解决方案 | 开源日报 No.47

leonardomso/33-js-concepts Stars: 58.4k License: MIT 这个项目是一个帮助开发者掌握 JavaScript 概念的资源库。该项目基于 Stephen Curtis 撰写的一篇文章&#xff0c;包含了对 33 个重要 JavaScript 概念全面深入地讲解&#xff0c;并被 GitHub 评为 2018 年最佳开源项目…

【二】spring boot-设计思想

spring boot-设计思想 简介&#xff1a;现在越来越多的人开始分析spring boot源码&#xff0c;拿到项目之后就有点无从下手了&#xff0c;这里介绍一下springboot源码的项目结构 一、项目结构 从上图可以看到&#xff0c;源码分为两个模块&#xff1a; spring-boot-project&a…

linux虚拟机查看防火墙状态

linux虚拟机查看防火墙状态 在Linux虚拟机中&#xff0c;你可以通过以下几种方法查看防火墙状态&#xff1a; 查看iptables防火墙状态 对于使用iptables防火墙的Linux系统&#xff0c;可以使用以下命令查看防火墙状态&#xff1a; sudo iptables -L -v -n查看firewalld防火墙…

c++---模板篇

1、模板 概念&#xff1a;模板就是建立通用的模具&#xff0c;大大提高复用性 特点&#xff1a; 模板不可以直接使用&#xff0c;它只是一个框架模板的通用并不是万能的 1.1、函数模板 C另一种编程思想称为泛型编程&#xff0c;主要利用的技术就是模板C提供两种模板机制&a…

3D孪生场景SDK:Viwer 孪生世界

NSDT 编辑器 提供三维场景构建、场景效果设计、场景服务发布全流程工具等&#xff0c;其场景编辑器支持资产管理、灯光设置、骨骼动画等功能&#xff1b;致力于协助资源不足的中小企业及个人快速开发数字孪生场景&#xff0c;帮助企业提高生产力、实现降本增效。 NSDT编辑器简…

MySQL之主从复制

概述&#xff1a; 将主库的数据 变更同步到从库&#xff0c;从而保证主库和从库数据一致。 它的作用是 数据备份&#xff0c;失败迁移&#xff0c;读写分离&#xff0c;降低单库读写压力 原理&#xff1a; 主服务器上面的任何修改都会保存在二进制日志&#xff08; Bin-log日志…

【Overload游戏引擎分析】画场景网格的Shader

Overload引擎地址&#xff1a; GitHub - adriengivry/Overload: 3D Game engine with editor 一、栅格绘制基本原理 Overload Editor启动之后&#xff0c;场景视图中有栅格线&#xff0c;这个在很多软件中都有。刚开始我猜测它应该是通过绘制线实现的。阅读代码发现&#xff0…

【Pytorch笔记】6.Transforms

pytorch官方文档 - transforms transforms需要使用计算机视觉工具包&#xff1a;torchvision。 torchvision.transforms&#xff1a;常用的图像预处理方法&#xff1b; torchvision.datasets&#xff1a;常用数据集的dataset实现&#xff0c;如MNIST、CIFAR-10、ImageNet等&am…

[每日算法 - 阿里机试] leetcode19. 删除链表的倒数第 N 个结点

入口 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能&#xff0c;轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/remove-nth-node-from-end…

java项目log4j2单独为某个类配置日志文件

在项目中&#xff0c;一般都是把日志记录到一个日志文件中。 对应的log4j2.xml内容如下图所示&#xff1a;只有一个RollingFile节点&#xff0c;整个系统只会生成一个log日志文件。 生成的日志文件如下图&#xff1a; 当系统不断扩大&#xff0c;业务越来越复杂&#xff0c;所…

假期题目整合

1. 下载解压题目查看即可 典型的猪圈密码只需要照着输入字符解开即可得到答案 2. 冷门类型的密码题型&#xff0c;需要特意去找相应的解题思路&#xff0c;直接百度搜索天干地支解密即可 3. 一眼能出思路他已经给了篱笆墙的提示提示你是栅栏密码对应解密即可 4. 最简单的社会主…

236. 二叉树的最近公共祖先

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可以是它自己的…

(二)Web服务器之Linux多进程

一、基础概念 Linux操作系统一般由以下四个主要部分组成&#xff1a;内核、shell、文件系统和应用程序 。 内核&#xff08;Kernel&#xff09;&#xff1a;是操作系统的核心部分&#xff0c;负责管理系统的硬件资源、进程管理、内存管理、文件系统等。它直接与硬件交互&…