1、设置树莓派
1.1、安装运行库
在 Raspbian Lite 上运行 Avalonia 应用所需的一些库:
apt install libgbm1 libgl1-mesa-dri libegl1-mesa libinput10
可以使用工具 kmscube
来验证 DRM
# 安装
apt install kmscube
# 运行
kmscube
应该在树莓派屏幕上看到旋转的立方体
1.2、安装dotnet8
wget https://download.visualstudio.microsoft.com/download/pr/aed2eece-af6d-42e6-8683-21e7835b7479/786b4f225591440a741c1702407fb7b3/dotnet-sdk-8.0.203-linux-arm64.tar.gz -O dotnet-sdk.tar.gz
mkdir -p /opt/dotnet/8.0
pv dotnet-sdk.tar.gz | tar -C /opt/dotnet/8.0 -zxf -
rm dotnet-sdk.tar.gz
ln -s /opt/dotnet/8.0/dotnet /usr/local/bin
echo "export DOTNET_ROOT=/opt/dotnet/8.0" >> /etc/profile
echo "export PATH=\$PATH:\$DOTNET_ROOT" >> /etc/profile
source /etc/profile
2、准备Avalonia应用
2.1、创建应用
创建新的Avalonia MVVM应用,在本教程中,我们称其为 AvaloniaDrm
2.2、创建MainView
当我们通过 FrameBuffer 工作时,没有窗口,因此我们需要一个单独的视图(UserControl),它将是我们的顶级控件。该视图是普通窗口的对应物。
MainView
将是我们开发 UI 的应用基础,在Views文件夹下创建:
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="AvaloniaDrm.Views.MainView">
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" Margin="30" Spacing="30">
<TextBlock FontSize="25" Text="Welcome to Avalonia !" />
<Slider />
</StackPanel>
</UserControl>
现在创建一个名为 MainSingleView
的新 UserControl
,并托管 MainView
<UserControl xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:views="clr-namespace:AvaloniaDrm.Views"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="AvaloniaDrm.Views.MainSingleView">
<views:MainView />
</UserControl>
还要更改 MainWindow.axaml
以在其中托管 MainView
:
<Window xmlns="https://github.com/avaloniaui"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:views="clr-namespace:AvaloniaDrm.Views"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
x:Class="AvaloniaDrm.Views.MainWindow"
Icon="/Assets/avalonia-logo.ico"
Title="AvaloniaDrm">
<views:MainView />
</Window>
正如您所看到的,MainView
在 MainSingleView
和 MainWindow
中都被托管。这使得开发时在桌面和树莓派上运行应用程序变得更加容易。
2.3、准备 Program.cs
接下来,我们需要准备 Program.cs
以启用DRM的使用。 将 Main 方法更改为以下内容:
internal sealed class Program
{
[STAThread]
public static int Main(string[] args)
{
var builder = BuildAvaloniaApp();
if (args.Contains("--drm"))
{
return builder.StartLinuxDrm(args, "/dev/dri/card1", 1.0);
}
return builder.StartWithClassicDesktopLifetime(args);
}
public static AppBuilder BuildAvaloniaApp()
=> AppBuilder.Configure<App>()
.UsePlatformDetect()
.WithInterFont()
.LogToTrace();
}
2.4、准备 App.axaml.cs
在 App.axaml.cs
中更改 OnFrameworkInitializationCompleted()
:
public override void OnFrameworkInitializationCompleted()
{
if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{
desktop.MainWindow = new MainWindow();
}
else if (ApplicationLifetime is ISingleViewApplicationLifetime singleView)
{
singleView.MainView = new MainSingleView();
}
base.OnFrameworkInitializationCompleted();
}
3、在树莓派上运行
发布程序,将目标运行时配置为linux-arm64
,选中生成单个文件
,将生成AvaloniaDrm
、libHarfBuzzSharp.so
、libSkiaSharp.so
,将这些文件传送到树莓派上。(也可以在发布配置文件中添加<IncludeNativeLibrariesForSelfExtract>true</IncludeNativeLibrariesForSelfExtract>
这样可以将Native库包含到一个文件中)
为程序文件添加执行权限
chmod +x AvaloniaDrm
现在,可以运行程序
./AvaloniaDrm --drm
4、参考链接
在树莓派上通过 Raspbian Lite 运行 | Avalonia Docs (avaloniaui.net)
c# – Error when trying to run Avalonia through DRM in raspberry pi 4 – Stack Overflow
5、补充
如果在x86架构的设备上使用,可能还需要安装 libfontconfig1
包
apt install libfontconfig1