Avaloni11笔记
环境
Avalonia 11.3.6
如何实现多端
本质上,是一个核心程序+多个启动程序。Desktop和移动端(Android和IOS)需要分别写启动程序。
例如,核心程序=AvaloniaDemo,如果需要在移动端运行,就需要创建移动端的启动程序。
移动端启动程序
- 首先,我们创建新项目,项目模板选择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标签
- 然后编辑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。
- 编辑AvaloniaDemo的App.cs
- 移动端必须要使用View而不是Window,否则在运行到MainWindow的构造函数时会报错。
- 判断当前是不是移动端程序,使用
if (ApplicationLifetime is ISingleViewApplicationLifetime singleViewPlatform)
- 最后,就可以启动AvaloniaDemo.Android了

桌面端启动程序
同样使用项目模板选择Avalonia.Net App创建项目,在Program.cs里,修改BuildAvaloniaApp函数内AppBuilder.Configure的泛型为AvaloniaDemo的App
中文问题
平台区别
- 在Windows环境里,可以直接显示中文。但是需要主要axaml文件的编码格式,应该是UTF-8,否则中文会显示乱码。
- 在Android里,中文会显示成方块。除非页面每个控件单独设置字体
<TextBlock Text="水平" FontFamily="sans-serif" />

使用自定义字体
在网上有多种方法,本机Android测试时通过设置Program里BuildAvaloniaApp函数
.With(new FontManagerOptions
{
DefaultFamilyName = Font,
})
是没有效果的。下面讲一下在我的环境下的解决办法。
- 当前的目录结构如下
AvaloniaDemo
├─Assets
│ └─MiSans-Normal.ttf
MiSans-Normal.ttf的生成操作设置为AvaloniaResource。
- 在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://项目名开始的文件路径/字体文件名#字体名
如果不知道字体名,双击打开字体文件,在窗口里可以看到字体名称

- 然后编译运行就可以看到中文正常显示了
![467CD720-F145-4529-9AB8-A2FC95BABF18]()



浙公网安备 33010602011771号