Avaloni11笔记

环境

Avalonia 11.3.6

如何实现多端

本质上,是一个核心程序+多个启动程序。Desktop和移动端(Android和IOS)需要分别写启动程序。

例如,核心程序=AvaloniaDemo,如果需要在移动端运行,就需要创建移动端的启动程序。

移动端启动程序

  1. 首先,我们创建新项目,项目模板选择Avalonia.Net App,随便起个名字。我们这里叫AvaloniaDemo.Android。
    46ECA427-A730-43dd-910D-A2976BA3B986
    创建完成后,我们使用编辑项目文件来查看项目文件,这时文件里的内容应该是
<Project Sdk="Microsoft.NET.Sdk">
	<PropertyGroup>
		<TargetFramework>net9.0-android</TargetFramework>
		<OutputType>Exe</OutputType>
		<Nullable>enable</Nullable>
		<UseMaui>false</UseMaui>
		<SupportedOSPlatformVersion>21</SupportedOSPlatformVersion>
	</PropertyGroup>
	<ItemGroup>
		<PackageReference Include="Avalonia.Android" Version="11.3.6" />
	</ItemGroup>
	<ItemGroup>
		<ProjectReference Include="..\AvaloniaDemo\AvaloniaDemo.csproj" />
	</ItemGroup>
</Project>

注意TargetFramework标签和outputType标签

  1. 然后编辑MainActivity.CS,代码是
[Activity(Label = "AvaloniaDemo", MainLauncher = true,Theme = "@style/Theme.AppCompat.Light.NoActionBar")]
public class MainActivity : AvaloniaMainActivity<AvaloniaDemo.App>
{
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
    }
}

关键代码是当前类一定要继承自AvaloniaMainActivity,泛型是主程序的App。

  1. 编辑AvaloniaDemo的App.cs
    • 移动端必须要使用View而不是Window,否则在运行到MainWindow的构造函数时会报错。
    • 判断当前是不是移动端程序,使用
if (ApplicationLifetime is ISingleViewApplicationLifetime singleViewPlatform)
  1. 最后,就可以启动AvaloniaDemo.Android了

C61EC70A-48CB-4aae-90A0-4D2FFC6205B0

桌面端启动程序

同样使用项目模板选择Avalonia.Net App创建项目,在Program.cs里,修改BuildAvaloniaApp函数内AppBuilder.Configure的泛型为AvaloniaDemo的App

中文问题

平台区别

  1. 在Windows环境里,可以直接显示中文。但是需要主要axaml文件的编码格式,应该是UTF-8,否则中文会显示乱码。
  2. 在Android里,中文会显示成方块。除非页面每个控件单独设置字体
<TextBlock Text="水平" FontFamily="sans-serif" />

7175E9EC-868B-4df3-AE5F-4DE0ACD024D6

使用自定义字体

在网上有多种方法,本机Android测试时通过设置Program里BuildAvaloniaApp函数

 .With(new FontManagerOptions
 {
     DefaultFamilyName = Font,
 })

是没有效果的。下面讲一下在我的环境下的解决办法。

  1. 当前的目录结构如下

AvaloniaDemo
├─Assets
│ └─MiSans-Normal.ttf

MiSans-Normal.ttf的生成操作设置为AvaloniaResource。

  1. 在App.axaml的Application.Styles节点里设置控件字体
<Application.Styles>
    <FluentTheme />
     <Style Selector="TextBlock">
        <Setter Property="FontFamily" 
                Value="avares://AvaloniaDemo/Assets/MiSans-Normal.ttf#MiSans Normal"/>
    </Style>
     <Style Selector="Button">
        <Setter Property="FontFamily" 
                Value="avares://AvaloniaDemo/Assets/MiSans-Normal.ttf#MiSans Normal"/>
    </Style>
    <Style Selector="ComboBox">
        <Setter Property="FontFamily"
                Value="avares://AvaloniaDemo/Assets/MiSans-Normal.ttf#MiSans Normal"/>
    </Style>
</Application.Styles>

格式是avares://项目名开始的文件路径/字体文件名#字体名

如果不知道字体名,双击打开字体文件,在窗口里可以看到字体名称
826E13A4-FF6E-49f4-8F78-39510E40E1A7

  1. 然后编译运行就可以看到中文正常显示了
    467CD720-F145-4529-9AB8-A2FC95BABF18
posted @ 2025-10-17 15:21  烟台西炮台  阅读(16)  评论(0)    收藏  举报