注:本文树莓派版本为Raspberry Pi 4 Model B
单视图模式问题
App.axaml.cs部分
通常,Avalonia生成的OnFrameworkInitializationCompleted函数中仅有
......
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{
DisableAvaloniaDataAnnotationValidation();
desktop.MainWindow = new MainWindow
{
DataContext = provider.GetRequiredService<MainWindowViewModel>()
};
}
......
而 Raspberry Pi OS Lite 并无桌面概念,故该 if 恒为 false:其中的逻辑永远不会被执行,即 desktop.MainWindow 并未被赋值,表现为显示屏一片漆黑
需要添加:
else if (ApplicationLifetime is ISingleViewApplicationLifetime single)
{
DisableAvaloniaDataAnnotationValidation();
single.MainView = new MainSingle
{
DataContext = provider.GetRequiredService<MainSingleViewModel>()
};
}
此处需要说明:
MainSingle 是 UserControl,如上文所述,Raspberry Pi OS Lite 并无桌面概念,自然也无法理解 Window,所以需要是 UserControl
Program.cs部分
通常,Avalonia生成的Main函数中仅有
public static void Main(string[] args)
{
BuildAvaloniaApp()
.StartWithClassicDesktopLifetime(args);
}
与上文所述类似,该Main函数仅适用桌面环境,StartWithClassicDesktopLifetime 依赖 X11/Wayland 等桌面会话,而 Lite 版本需要通过 StartLinuxDrm 使用 DRM 渲染(旧版本 Linux 或许需要使用 Framebuffer 渲染,此处不做说明)
需要修改:
var builder = BuildAvaloniaApp();
if (args.Contains("--drm"))
{
builder.StartLinuxDrm(args: args, card: null, scaling: 1.0);
}
else
{
builder.StartWithClassicDesktopLifetime(args);
}
此时就可通过 sudo ./file_name --drm 来选择使用 DRM 渲染
此处需要说明:
1. StartLinuxDrm 函数需要安装 Avalonia.LinuxFramebuffer,通过 Avalonia 模板创建的项目可能不含它
2. 启动项目时可能会遇到报错:Unhandled exception. System.ComponentModel.Win32Exception (95): drmModeGetResources failed
此时可通过指令 ls /dev/dri 查看 DRM 设备节点,通常会有 card0 与 card1,其中 card0 是内置GPU,可在 StartLinuxDrm 函数中添加 card: "/dev/dri/card0" 参数来指定渲染设备
StartLinuxDrm(args: args, card: "/dev/dri/card0", scaling: 1.0)
MVVM模式问题
Avalonia 提供了 ViewLocator.cs 来实现 View 和 ViewModel 之间的绑定,该绑定是通过反射机制实现的,所以在发布时不可勾选"裁剪未使用的代码",否则会出现:
View 是通过反射调用的,代码中无直接引用,会被裁剪 => ViewLocator 根据 ViewModel 的命名尝试通过反射调用 View,但无法做到,体现为该页面显示 Not Found: YourProject.Views.YourView

403

被折叠的 条评论
为什么被折叠?



