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键

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

4.在OpenKylin中双击运行程序

在网上搜了很多解决方法,有通过sh脚本运行的,试过了,双击没有反应,一顿操作后,发现了问题所在。是avalonia应用需要在英语环境下运行,原因如踩坑的第一个问题。所以,我们需要在全局修改LANG。你可以像其他linux环境中一样通过命令修改配置文件,也可以像我这样,在设置中修改。

1.全局设置LANG

1.打开终端,用管理员身份

sudo -s

2.修改环境变量配置

最方便的修改方法:设置-语言-将系统语言改成英语,改后如下:

image

2.查看环境变量LANG

image-1691476881153

修改设置后,全局的语言已经改成了English。

3.双击软件

修改系统语言后,再次双击软件,直接运行。

image-1691476889208

4.运行结果

程序成功运行,记录

image-1691476905146

5.创建快捷启动方式

由于我们的软件在linux的环境下,本身没有图标显示,我们现在导入一张图片进入,做一个快捷启动方式

1.导入图标

image-1691476914920

2.创建一个文件

创建一个文件,可以是txt或者别的,然后用记事本或者kylin-code打开,我这里是用的kylin-code

image-1691476922162

内容如下:

[Desktop Entry]Name=TerraMours
Exec=/home/raokun/terramours/TerraMours.Chat.Ava %u
Terminal=false
Type=Application
Icon=/home/raokun/terramours/logo.png
StartupwMClass=TerraMours
Categories=Network;Comment=TerraMours

Exec 改成你的软件位置

Icon 改成你的图标位置

3.成果

image-1691477119210

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

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

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