Avalonia项目在OpenKylin运行踩坑

avalonia,项目,openkylin,运行 · 浏览次数 : 219

小编点评

**Avalonia 项目在 OpenKylin 中运行踩坑本篇博客记录** **问题描述** OpenKylin 中运行 Avalonia 项目时出现以下错误: ``` Unhandled exception. System.InvalidOperationException: Default font family name can't be null or empty. ``` **解决方案** 根据错误信息,默认字体系列名称为空或空字符串。您可以通过以下方法查看系统已安装的字体列表: ``` fc-list ``` **解决方案 1:修改环境变量 `Lang`** 根据错误信息,可以尝试修改 `Lang` 环境变量的值为 `en_US.UTF-8`。您可以使用以下命令进行设置: ``` export LANG=en_US.UTF-8 ``` **解决方案 2:重新启动终端** 在修改 `Lang` 环境变量之前,请确保重新启动终端。 **解决方案 3:避免使用 `using` 语句** 在使用 `context.Database.Migrate()` 时,请确保不要使用 `using` 语句。 **解决方案 4:使用 `VMLocator.ChatDbcontext` 来获取上下文实例** 请使用 `VMLocator.ChatDbcontext` 来获取上下文实例,而不是使用 `context.Database`。 **其他提示** * 确保您的系统已安装了 Linux 内置字体。 * 确保您的应用程序具有写入硬 drive 的权限。 * 请检查您使用的驱动程序是否支持 Linux 环境。

正文

Avalonia项目在OpenKylin运行踩坑

本篇博客记录OpenKylin开源操作系统中运行Avalonia项目遇到的各种问题,会一直更新,最新的内容请点击文末的链接跳转到我的博客原文地址查看。

1.Default font family name can't be null or empty

报错内容:

Unhandled exception. System.InvalidOperationException: Default font family name can't be null or empty.
   at Avalonia.Media.FontManager..ctor(IFontManagerImpl platformImpl) in /_/src/Avalonia.Base/Media/FontManager.cs:line 37
   at Avalonia.Media.FontManager.get_Current() in /_/src/Avalonia.Base/Media/FontManager.cs:line 59
   at Avalonia.AppBuilder.<>c__DisplayClass61_0.<ConfigureFonts>b__0(AppBuilder appBuilder) in /_/src/Avalonia.Controls/AppBuilder.cs:line 256
   at Avalonia.AppBuilder.SetupUnsafe() in /_/src/Avalonia.Controls/AppBuilder.cs:line 310
   at Avalonia.ClassicDesktopStyleApplicationLifetimeExtensions.StartWithClassicDesktopLifetime(AppBuilder builder, String[] args, ShutdownMode shutdownMode) in /_/src/Avalonia.Controls/ApplicationLifetimes/ClassicDesktopStyleApplicationLifetime.cs:line 219
   at TerraMours.Chat.Ava.Program.Main(String[] args)

报错分析:

根据报错信息,应用程序在使用 Avalonia UI 框架时遇到了问题。报错信息表明默认字体系列名称为空或为空字符串。

可以通过以下命令查看系统已安装的字体列表:

fc-list

重点issue

这是一个很久的问题,参考这个issue

https://github.com/AvaloniaUI/Avalonia/issues/4427

尝试第一个解决方案(0.10版本及以前有效)

网上的解决方案,针对0.10版本及以前有效 解决方案一

由于 11.0.0 更改了 Avalonia.Skia.GlyphTypefaceImpl 的访问级别,从公共访问级别更改为内部访问级别,因此上述实现 Avalonia.Platform.IFontManagerImpl 的示例代码现在均不可用。

V11版本解决方案

1.修改环境变量 export Lang=en_ US.UTF-8

https://github.com/AvaloniaUI/Avalonia/issues/12140

将环境变量设置 export Lang=en_ US.UTF-8

image-20230725145938957

1.打开终端。

2.运行以下命令来查看当前的 LANG 环境变量的值:

echo $LANG

3.如果当前的 LANG 值不是 en_US.UTF-8,就需要设置它为 en_US.UTF-8。可以使用以下命令来设置:

export LANG=en_US.UTF-8

4.使用 echo 命令验证环境变量是否已更改:

echo $LANG

5.如果您希望永久设置 LANG 变量,可以将上述命令添加到您的 shell 配置文件中(如 ~/.bashrc~/.bash_profile 等),这样每次启动终端时都会自动设置。

代码中修改掉linux不支持的字体

将字体修改后

 <Setter Property="FontFamily" Value="宋体,国标黑体,Simsun,微软雅黑,Microsoft YaHei,苹方-简,宋体-简" />

linux中没有宋体,会自动选择后面的国标黑体

成果展示

image-20230725181623426

2.Cannot access a disposed context instance

报错记录

Unhandled exception. System.ObjectDisposedException: Cannot access a disposed context instance. A common cause of this error is disposing a context instance that was resolved from dependency injection and then later trying to use the same context instance elsewhere in your application. This may occur if you are calling 'Dispose' on the context instance, or wrapping it in a using statement. If you are using dependency injection, you should let the dependency injection container take care of disposing context instances.
Object name: 'ChatDbcontext'.
   at Microsoft.EntityFrameworkCore.DbContext.CheckDisposed()
   at Microsoft.EntityFrameworkCore.DbContext.get_ContextServices()
   at Microsoft.EntityFrameworkCore.DbContext.get_Model()
   at Microsoft.EntityFrameworkCore.Internal.InternalDbSet`1.get_EntityType()
   at Microsoft.EntityFrameworkCore.Internal.InternalDbSet`1.get_EntityQueryable()
   at Microsoft.EntityFrameworkCore.Internal.InternalDbSet`1.System.Collections.Generic.IEnumerable<TEntity>.GetEnumerator()
   at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   at System.Collections.ObjectModel.ObservableCollection`1..ctor(IEnumerable`1 collection)
   at TerraMours.Chat.Ava.Views.MainWindow.MainWindow_Loaded(Object sender, RoutedEventArgs e)
   at System.Threading.Tasks.Task.<>c.<ThrowAsync>b__128_0(Object state)
   at Avalonia.Threading.SendOrPostCallbackDispatcherOperation.InvokeCore() in /_/src/Avalonia.Base/Threading/DispatcherOperation.cs:line 412
   at Avalonia.Threading.DispatcherOperation.Execute() in /_/src/Avalonia.Base/Threading/DispatcherOperation.cs:line 268
   at Avalonia.Threading.Dispatcher.ExecuteJob(DispatcherOperation job) in /_/src/Avalonia.Base/Threading/Dispatcher.Queue.cs:line 126
   at Avalonia.Threading.Dispatcher.ExecuteJobsCore() in /_/src/Avalonia.Base/Threading/Dispatcher.Queue.cs:line 181
   at Avalonia.Threading.Dispatcher.Signaled() in /_/src/Avalonia.Base/Threading/Dispatcher.Queue.cs:line 134
   at Avalonia.X11.X11PlatformThreading.CheckSignaled() in /_/src/Avalonia.X11/X11PlatformThreading.cs:line 119
   at Avalonia.X11.X11PlatformThreading.RunLoop(CancellationToken cancellationToken) in /_/src/Avalonia.X11/X11PlatformThreading.cs:line 192
   at Avalonia.Threading.DispatcherFrame.Run(IControlledDispatcherImpl impl) in /_/src/Avalonia.Base/Threading/DispatcherFrame.cs:line 117
   at Avalonia.Threading.Dispatcher.PushFrame(DispatcherFrame frame) in /_/src/Avalonia.Base/Threading/Dispatcher.MainLoop.cs:line 53
   at Avalonia.Threading.Dispatcher.MainLoop(CancellationToken cancellationToken) in /_/src/Avalonia.Base/Threading/Dispatcher.MainLoop.cs:line 80
   at Avalonia.Controls.ApplicationLifetimes.ClassicDesktopStyleApplicationLifetime.Start(String[] args) in /_/src/Avalonia.Controls/ApplicationLifetimes/ClassicDesktopStyleApplicationLifetime.cs:line 127
   at TerraMours.Chat.Ava.Program.Main(String[] args)

原因

在 Linux 环境下发生此错误可能是因为 Linux 环境的异步处理方式与 Windows 环境有所不同。

image-20230725155328226

解决方案

去掉using

public void CreateDatabase()
{
    var context = new ChatDbcontext();
    context.Database.Migrate();
    VMLocator.ChatDbcontext = context;
}

然后,在其他需要使用 ChatDbcontext 的地方,使用 VMLocator.ChatDbcontext 来获取上下文实例。确保不要在其他地方使用 using 语句或调用上下文实例的 Dispose 方法。

3.openkylin会自动切换到平板模式

而且切换不回来,程序点不了

image-20230725165153685

解决方案

可以通过桌面侧边栏进行PC/平板模式切换,唤出侧边栏的方法有:

点击任务栏上的侧边栏图标;

快捷键 super + A;----super对应Windows键

通过触摸手势,在屏幕右边缘向左短滑。

阅读如遇样式问题,请前往个人博客浏览: https://www.raokun.top

拥抱ChatGPT:https://ai.terramours.site

开源项目地址:https://github.com/raokun/TerraMours.Chat.Ava

与Avalonia项目在OpenKylin运行踩坑相似的内容:

Avalonia项目在OpenKylin运行踩坑

# Avalonia项目在OpenKylin运行踩坑 本篇博客记录OpenKylin开源操作系统中运行Avalonia项目遇到的各种问题,会一直更新,最新的内容请点击文末的链接跳转到我的[博客原文地址](https://www.raokun.top/archives/avalonia-xiang-m

在虚拟机VMware上安装OpenKylin开源操作系统

# 在虚拟机(VMware)上安装OpenKylin开源操作系统 今天我们一下学习下开放麒麟系统的安装。也是我的开源项目在OpenKylin上运行的实践。 希望通过该项目了解和学习Avalonia开发的朋友可以在我的github上拉取代码,同时希望大家多多点点star。 https://github

Avalonia项目打包安装包

# Avalonia项目打包安装包 要将 Avalonia 项目打包成安装包,你可以使用 Avalonia 发布工具来完成 # 1.创建一个发布配置文件 在你的 Avalonia 项目中,创建一个发布配置文件。在项目文件夹中创建一个名为 `publish.xml` 的文件,并添加以下内容: ```x

Avalonia 实现动态托盘

先下载一个gif图片,这里提供一个gif图片示例 在线GIF图片帧拆分工具 - UU在线工具 (uutool.cn) 使用这个网站将gif切成单张图片 创建一个Avalonia MVVM的项目,将图片copy进去 在项目文件中添加一下代码:

Avalonia开发(二)项目结构解析

一、前言 在Avalonia开发(一)环境搭建 文章中介绍了Avalonia的介绍、开发环境的搭建、项目创建,以及项目FirstAvaloniaApp项目结构的介绍。本篇文章将介绍各平台的项目介绍。 二、Desktop项目结构 FirstAvaloniaApp.Desktop项目中默认生成的只有两个

Avalonia应用在基于Linux的国产操作deepin上运行

deepin系统介绍 deepin(原名Linux Deepin)致力于为全球用户提供美观易用,安全可靠的 Linux发行版。deepin项目于2008年发起,并在2009年发布了以 linux deepin为名称的第一个版本。2014年4月更名为 deepin,在中国常被称为“深度操作系统”。 截

创建Avalonia 模板项目-基础

# 创建Avalonia 模板项目-基础 Avalonia是一个跨平台的.NET框架,用于构建漂亮、现代的图形用户界面(GUI)。使用Avalonia,您可以从单个代码库创建适用于Windows、macOS、 Linux、iOS、Android和Web Assembly的原生应用程序。 本文部分内容

基于Avalonia 11.0.0+ReactiveUI 的跨平台项目开发1-通用框架

# 基于Avalonia 11.0.0+ReactiveUI 的跨平台项目开发1-通用框架 ### Avalonia简介: Avalonia是.NET的一个跨平台UI框架,提供了一个灵活的样式系统,支持广泛的操作系统,如Windows、Linux、macOS,并对Android、iOS和WebAss

基于Avalonia 11.0.0+ReactiveUI 的跨平台项目开发2-功能开发

# 基于Avalonia 11.0.0+ReactiveUI 的跨平台项目开发2-功能开发 ![image-20230718225201652](https://www.raokun.top/upload/2023/07/image-20230718225201652.png) **项目简介**:目

封装avalonia指定组件允许拖动的工具类

封装avalonia指定组件允许拖动的工具类 创建Avalonia的MVVM项目,命名DragDemo ,然后将项目的Nuget包更新到预览版