解決WPF+Avalonia在openKylin系統下預設字體問題

来源:https://www.cnblogs.com/wdw984/archive/2023/09/21/17717864.html
-Advertisement-
Play Games

一、openKylin簡介 openKylin(開放麒麟) 社區是在開源、自願、平等和協作的基礎上,由基礎軟硬體企業、非營利性組織、社團組織、高等院校、科研機構和個人開發者共同創立的一個開源社區,致力於通過開源、開放的社區合作,構建桌面操作系統開源社區,推動Linux開源技術及其軟硬體生態繁榮發展。 ...


一、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

下載後按照下麵目錄結構放入字體文件(也可自定義其它路徑,只要代碼中的路徑做出對應調整即可)

 在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

 1 public static class AvaloniaAppBuilderExtensions
 2 {
 3     public static AppBuilder UseFontAlibaba([DisallowNull] this AppBuilder builder, Action<FontSettings>? configDelegate = default)
 4     {
 5         var setting = new FontSettings();
 6         configDelegate?.Invoke(setting);
 7 
 8         return builder.With(new FontManagerOptions
 9         {
10             DefaultFamilyName = setting.DefaultFontFamily,
11             FontFallbacks = new[]
12             {
13                 new FontFallback
14                 {
15                     FontFamily = new FontFamily(setting.DefaultFontFamily)
16                 }
17             }
18         }).ConfigureFonts(manager => manager.AddFontCollection(new EmbeddedFontCollection(setting.Key, setting.Source)));
19     }
20 }

在Program.cs中註冊一下新建的AppBuilder(.UseFontAlibaba())

 1 class Program
 2 {
 3     // Initialization code. Don't use any Avalonia, third-party APIs or any
 4     // SynchronizationContext-reliant code before AppMain is called: things aren't initialized
 5     // yet and stuff might break.
 6     [STAThread]
 7     public static void Main(string[] args) => BuildAvaloniaApp()
 8         .StartWithClassicDesktopLifetime(args);
 9 
10     // Avalonia configuration, don't remove; also used by visual designer.
11     public static AppBuilder BuildAvaloniaApp()
12         => AppBuilder.Configure<App>()
13             .UsePlatformDetect()
14             .UseFontAlibaba()
15             .WithInterFont()
16             .LogToTrace()
17             .UseReactiveUI();
18 }

 然後在編譯發佈項目,複製到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://www.cnblogs.com/wdw984/p/17717864.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 目錄前言介紹照片:後續: 前言 V~~~V。 介紹 進程間通訊(Inter-Process Communication,IPC)是操作系統中的一個重要概念,用於不同進程之間的數據傳輸和交互。有多種方式可以實現進程間通訊,以下是其中一些常見的方式: 管道(Pipe):管道是一種單向通信方式,通常用於具 ...
  • 等待事件或等待其他條件 坐車案例 想象一種情況:假設晚上坐車外出,如何才能確保不坐過站又能使自己最輕鬆? 方法一:不睡覺,時刻關註自己的位置 1 #include <iostream> 2 #include <thread> 3 #include <mutex> 4 using namespace ...
  • 基於java線上心理健康咨詢系統設計與實現,可適用於基於java心理健康,java心理咨詢室系統,大學生心理健康,心理健康系統,大學生心理評測管理系統,心理健康平臺系統,校園心理健康評測平臺,校園健康咨詢,校園心理健康咨詢,java心理咨詢室,校園心理咨詢室。 ...
  • Record Patterns 第一次發佈預覽是在JDK 19、隨後又在JDK 20中進行了完善。現在,Java 21開始正式推出該特性優化。下麵我們通過一個例子來理解這個新特性。 record Point(int x, int y) {} static void printSum(Object o ...
  • 基於java酒店客房管理系統設計與實現,可適用於java酒店管理系統,客房系統,酒店客房系統,酒店保潔系統,酒店打掃系統,酒店客房系統,客房酒店管理系統,酒店房間系統,酒店房間管理系統,酒店房間打掃,酒店房間保潔系統,房間酒店系統,賓館客房系統等等; ...
  • 目錄一、爬取目標二、爬取結果三、代碼講解四、技術總結五、演示視頻六、附完整源碼 一、爬取目標 您好!我是@馬哥python說,一名10年程式猿。 今天分享一期爬蟲案例,爬取的目標是:今日頭條熱榜的榜單數據。 打開今日頭條 首頁,在頁面右側會看到頭條熱榜,如下: 爬取以上6個關鍵欄位,含: 熱榜排名, ...
  • Sunday 演算法是一種字元串搜索演算法,由`Daniel M.Sunday`於1990年開發,該演算法用於在較長的字元串中查找子字元串的位置。演算法通過將要搜索的模式的字元與要搜索的字元串的字元進行比較,從模式的最左側位置開始。如果發現不匹配,則演算法將模式向右`滑動`一定數量的位置。這個數字是由當前文本... ...
  • matplotlib的動畫一直是一個強大但使用頻率不高的功能,究其原因,一方面展示動畫需要一定的媒介,沒有圖形和文字展示方便;二來大家更關心的是分析結果的最終圖表,圖表的動態展示則沒有那麼重要。 不過,隨著短視頻的興起,在短視頻平臺上展示動畫變得非常容易,所以,我們發現有越來越多的數據分析動畫(比如 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...