资源Assets

许多应用程序需要在其可执行文件中包含位图和资源字典,并从XAML中引用这些资源。

包含资源

可以使用项目文件中的<AvaloniaResource>项将资源包含在应用程序中。默认情况下,MVVM应用程序模板将Assets目录中的所有文件都作为<AvaloniaResource>包含:

<ItemGroup>
  <AvaloniaResource Include="Assets\**"/>
</ItemGroup>

您可以通过添加其他<AvaloniaResource>元素来包含任何想要的文件。

您会注意到我们在这里提到了_资源_,而 MSBuild 项称为 Avalonia 资源。内部将资源存储为.NET资源,但是因为术语“资源”与XAML资源发生冲突,我们将在整个过程中将其称为“资源”。

引用资源

在 XAML 中引用资源时,可以使用相对路径:

<Image Source="icon.png"/>
<Image Source="images/icon.png"/>
<Image Source="../icon.png"/>

或者使用绝对路径:

<Image Source="/Assets/icon.png"/> 

如果资源位于不同的程序集中,可以使用 avares: URI 方案引用资源。例如,如果资源位于名为 MyAssembly.dll 的程序集中,可以使用:

<Image Source="avares://MyAssembly/Assets/icon.png"/>

对于字体,可以在 "#" 符号后面提供字体名称:

<TextBlock FontFamily="avares://MyAssembly/Assets/font.ttf#FontName">test</TextBlock>

Avalonia 提供了转换器,可以自动将资源 URI 转换为以下任何类型:IImageIBitmapWindowIconFontFamily

引用清单资源

还可以通过在项目文件中使用 <EmbeddedResource> MSBuild 项来将资源包含在 .NET 应用程序中,这将导致该文件作为 清单资源 包含在程序集中。

可以使用 resm: URL 方案引用清单资源:

<Image Source="resm:MyApp.Assets.icon.png"/>

或者如果资源嵌入在与 XAML 文件不同的程序集中:

<Image Source="resm:MyApp.Assets.icon.png?assembly=MyAssembly"/>

资源的名称是由 MSBuild 自动从程序集名称、文件路径和文件名生成的,它们用点号分隔。如果 Avalonia 无法找到清单资源,请使用 Assembly.GetManifestResourceNames 检查资源名称。

注意:从 11.0 开始,Avalonia 不再支持清单 "resm" 资源。请改用 Avalonia 资源 (avares)。

从代码中加载资源

可以使用 IAssetLoader 接口从代码中加载资源:

var assets = AvaloniaLocator.Current.GetService<IAssetLoader>();
var bitmap = new Bitmap(assets.Open(new Uri(uri)));

上面代码中的 uri 变量可以包含任何有效的 URI,包括上述 avares:resm:。默认情况下,Avalonia 不支持 file://http://https:// 方案。如果要从磁盘或网络加载文件,可以自己实现这个功能,或者使用社区实现,例如 https://github.com/AvaloniaUtils/AsyncImageLoader.Avalonia。

Last updated