diff --git a/Semi.Avalonia.sln b/Semi.Avalonia.sln index a9245de..85b5a31 100644 --- a/Semi.Avalonia.sln +++ b/Semi.Avalonia.sln @@ -26,6 +26,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Semi.Avalonia.ColorPicker", EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Semi.Avalonia.Demo.Android", "demo\Semi.Avalonia.Demo.Android\Semi.Avalonia.Demo.Android.csproj", "{0C81FC1C-5D2D-478A-9876-923A0C85EC2F}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Semi.Avalonia.Demo.Drm", "demo\Semi.Avalonia.Demo.Drm\Semi.Avalonia.Demo.Drm.csproj", "{86D93406-412A-4429-93B2-92AAD0407784}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -61,6 +63,10 @@ Global {0C81FC1C-5D2D-478A-9876-923A0C85EC2F}.Debug|Any CPU.Deploy.0 = Debug|Any CPU {0C81FC1C-5D2D-478A-9876-923A0C85EC2F}.Release|Any CPU.ActiveCfg = Release|Any CPU {0C81FC1C-5D2D-478A-9876-923A0C85EC2F}.Release|Any CPU.Build.0 = Release|Any CPU + {86D93406-412A-4429-93B2-92AAD0407784}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {86D93406-412A-4429-93B2-92AAD0407784}.Debug|Any CPU.Build.0 = Debug|Any CPU + {86D93406-412A-4429-93B2-92AAD0407784}.Release|Any CPU.ActiveCfg = Release|Any CPU + {86D93406-412A-4429-93B2-92AAD0407784}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -70,6 +76,7 @@ Global {69A2C77D-6DB7-4AE4-B179-D1F5CF5E2DF0} = {43091528-9509-43CB-A003-9C5C11E96DD6} {D789AEDB-EBDF-4450-8E8E-B4A03FB257B0} = {43091528-9509-43CB-A003-9C5C11E96DD6} {0C81FC1C-5D2D-478A-9876-923A0C85EC2F} = {43091528-9509-43CB-A003-9C5C11E96DD6} + {86D93406-412A-4429-93B2-92AAD0407784} = {43091528-9509-43CB-A003-9C5C11E96DD6} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {7CA41ED3-2CED-40CC-AA21-28C3B42B1E86} diff --git a/demo/Semi.Avalonia.Demo.Desktop/App.axaml.cs b/demo/Semi.Avalonia.Demo.Desktop/App.axaml.cs index e70ba74..d5fe94a 100644 --- a/demo/Semi.Avalonia.Demo.Desktop/App.axaml.cs +++ b/demo/Semi.Avalonia.Demo.Desktop/App.axaml.cs @@ -1,7 +1,6 @@ using Avalonia; using Avalonia.Controls.ApplicationLifetimes; using Avalonia.Markup.Xaml; -using Avalonia.Styling; using Semi.Avalonia.Demo.Views; namespace Semi.Avalonia.Demo.Desktop; diff --git a/demo/Semi.Avalonia.Demo.Desktop/Program.cs b/demo/Semi.Avalonia.Demo.Desktop/Program.cs index d42b109..e011c45 100644 --- a/demo/Semi.Avalonia.Demo.Desktop/Program.cs +++ b/demo/Semi.Avalonia.Demo.Desktop/Program.cs @@ -1,7 +1,9 @@ -using System; -using Avalonia; +using Avalonia; using Avalonia.Dialogs; using Avalonia.Media; +using System; +using System.Linq; +using System.Threading; namespace Semi.Avalonia.Demo.Desktop; diff --git a/demo/Semi.Avalonia.Demo.Drm/App.axaml b/demo/Semi.Avalonia.Demo.Drm/App.axaml new file mode 100644 index 0000000..d4ceb6d --- /dev/null +++ b/demo/Semi.Avalonia.Demo.Drm/App.axaml @@ -0,0 +1,13 @@ + + + + + + + + + \ No newline at end of file diff --git a/demo/Semi.Avalonia.Demo.Drm/App.axaml.cs b/demo/Semi.Avalonia.Demo.Drm/App.axaml.cs new file mode 100644 index 0000000..f436ee6 --- /dev/null +++ b/demo/Semi.Avalonia.Demo.Drm/App.axaml.cs @@ -0,0 +1,24 @@ +using Avalonia; +using Avalonia.Controls.ApplicationLifetimes; +using Avalonia.Markup.Xaml; +using Semi.Avalonia.Demo.Views; + +namespace Semi.Avalonia.Demo.Drm +{ + public partial class App : Application + { + public override void Initialize() + { + AvaloniaXamlLoader.Load(this); + } + + public override void OnFrameworkInitializationCompleted() + { + if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop) + desktop.MainWindow = new MainWindow(); + else if (ApplicationLifetime is ISingleViewApplicationLifetime singleView) + singleView.MainView = new MainView(); + base.OnFrameworkInitializationCompleted(); + } + } +} \ No newline at end of file diff --git a/demo/Semi.Avalonia.Demo.Drm/Program.cs b/demo/Semi.Avalonia.Demo.Drm/Program.cs new file mode 100644 index 0000000..45d2f66 --- /dev/null +++ b/demo/Semi.Avalonia.Demo.Drm/Program.cs @@ -0,0 +1,59 @@ +using Avalonia; +using Avalonia.Dialogs; +using Avalonia.Media; +using System; +using System.Linq; +using System.Threading; + +namespace Semi.Avalonia.Demo.Drm +{ + internal class Program + { + // Initialization code. Don't use any Avalonia, third-party APIs or any + // SynchronizationContext-reliant code before AppMain is called: things aren't initialized + // yet and stuff might break. + [STAThread] + public static void Main(string[] args) + { + var builder = BuildAvaloniaApp(); + builder.With(new FontManagerOptions + { + FontFallbacks = new[] + { + new FontFallback + { + FontFamily = new FontFamily("Microsoft YaHei") + } + } + }); + if (args.Contains("--drm")) + { + SilenceConsole(); + builder.StartLinuxDrm(args: args, card: "/dev/dri/card0", scaling: 1); + } + else + { + builder.StartWithClassicDesktopLifetime(args); + } + } + + // Avalonia configuration, don't remove; also used by visual designer. + public static AppBuilder BuildAvaloniaApp() + => AppBuilder.Configure() + .UseManagedSystemDialogs() + .UsePlatformDetect() + .With(new Win32PlatformOptions()) + .LogToTrace(); + + private static void SilenceConsole() + { + new Thread(() => + { + Console.CursorVisible = false; + while (true) + Console.ReadKey(true); + }) + { IsBackground = true }.Start(); + } + } +} \ No newline at end of file diff --git a/demo/Semi.Avalonia.Demo.Drm/Semi.Avalonia.Demo.Drm.csproj b/demo/Semi.Avalonia.Demo.Drm/Semi.Avalonia.Demo.Drm.csproj new file mode 100644 index 0000000..7accf7a --- /dev/null +++ b/demo/Semi.Avalonia.Demo.Drm/Semi.Avalonia.Demo.Drm.csproj @@ -0,0 +1,22 @@ + + + WinExe + net7.0 + enable + true + app.manifest + + + + + + + + + + + + + + + diff --git a/demo/Semi.Avalonia.Demo.Drm/app.manifest b/demo/Semi.Avalonia.Demo.Drm/app.manifest new file mode 100644 index 0000000..938919a --- /dev/null +++ b/demo/Semi.Avalonia.Demo.Drm/app.manifest @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + diff --git a/demo/Semi.Avalonia.Demo.Drm/使用方法.md b/demo/Semi.Avalonia.Demo.Drm/使用方法.md new file mode 100644 index 0000000..efe659a --- /dev/null +++ b/demo/Semi.Avalonia.Demo.Drm/使用方法.md @@ -0,0 +1,51 @@ +# DRM启动步骤 + +(Ubuntu18.04Server版本 虚拟机测试OK) + +Avalonia官方参考文档:https://docs.avaloniaui.net/docs/next/guides/platforms/rpi/running-on-raspbian-lite-via-drm + +1.Linux端运行命令 + sudo apt update + sudo apt upgrade + sudo reboot + sudo apt - get install libgbm1 libgl1 - mesa - dri libegl1 - mesa libinput10 + +2.安装测试工具测试(出现一个彩色立方体说明环境安装完成) + sudo apt-get install kmscube + sudo kmscube + +3.安装.net运行时(参考网址:https://learn.microsoft.com/zh-cn/dotnet/core/install/linux?WT.mc_id=dotnet-35129-website) + +4.新建一个Avalonia项目,nuget里面添加Avalonia.LinuxFramebuffer包 + +5.添加StartLinuxDrm代码(不知道怎么添加看Semi.Avalonia.Demo.Drm项目代码) + +6.发布程序到Linux(安装.net,怎么运行这些省略) + +7.运行 ./Semi.Avalonia.Demo.Drm --drm + +## 报错处理: + +1. 报错内容 + +>Unhandled exception. Avalonia.Markup.Xaml.XamlLoadException: No precompiled XAML found for avares://Semi.Avalonia/Themes/Light/Light.axaml (baseUri: avares://Semi.Avalonia/Themes/Index.axaml), make sure to specify x:Class and include your XAML file as AvaloniaResource + + 解决方法: + 如果使用Semi发布文件不要裁剪,如果裁剪会报错 + + +2. 报错内容 +>Unhandled exception. System.TypeInitializationException: The type initializer for 'SkiaSharp.SKImageInfo' threw an exception.** + **--->System.DllNotFoundException: Unable to load shared library 'libSkiaSharp' or one of its dependencies.In order to help diagnose loading problems, consider setting the LD_DEBUG environment variable: liblibSkiaSharp: cannot open shared object file: No such file or directory + at SkiaSharp.SkiaApi.sk_colortype_get_default_8888() + at SkiaSharp.SKImageInfo..cctor() + +解决方法: + Linux命令行安装一下 apt-get install -y libfontconfig1 + 参考网址:https://github.com/mono/SkiaSharp/issues/509 + +3. 报错内容 +>Permission denied + +解决方法: + sudo chmod +x ./Semi.Avalonia.Demo.Drm \ No newline at end of file