StyleInclude, ResourceInclude, MergeResourceInclude)Primary APIs and build parts:
AvaloniaXaml / AvaloniaResource item groupsGenerateAvaloniaResourcesTaskAvaloniaXamlLoader.Load(Uri, ...)StyleIncludeResourceIncludeMergeResourceIncludeXmlnsDefinitionAttributeXmlnsPrefixAttributeReference source files:
packages/Avalonia/AvaloniaBuildTasks.propspackages/Avalonia/AvaloniaBuildTasks.targetssrc/Avalonia.Build.Tasks/GenerateAvaloniaResourcesTask.cssrc/Avalonia.Build.Tasks/XamlCompilerTaskExecutor.Helpers.cssrc/Markup/Avalonia.Markup.Xaml/Styling/StyleInclude.cssrc/Markup/Avalonia.Markup.Xaml/Styling/ResourceInclude.cssrc/Markup/Avalonia.Markup.Xaml/Styling/MergeResourceInclude.cssrc/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/GroupTransformers/XamlIncludeGroupTransformer.cssrc/Markup/Avalonia.Markup.Xaml.Loader/CompilerExtensions/GroupTransformers/XamlMergeResourceGroupTransformer.cssrc/Avalonia.Base/Metadata/XmlnsDefinitionAttribute.cssrc/Avalonia.Base/Metadata/XmlnsPrefixAttribute.csLibrary baseline:
AvaloniaXaml.AvaloniaResource.By default, *.axaml and *.paml are discovered as AvaloniaXaml when default items are enabled.
During build:
!AvaloniaResources,avares://AssemblyName/path URI.Canonical absolute form:
avares://MyLibrary/Themes/Colors.axamlSupported relative include forms (resolved from current document URI):
Style.xaml./Style.xaml../Style.xaml/Style.xamlIn grouped runtime documents (LoadGroup), relative resolution depends on each document BaseUri.
StyleInclude, ResourceInclude, MergeResourceInclude)StyleInclude / ResourceIncludeWhen source is compile-resolvable (avares:// or relative URI), compiler group transforms replace include nodes with direct compiled references.
At runtime (dynamic path), includes can still load via AvaloniaXamlLoader.Load(...).
MergeResourceIncludeSpecial behavior:
ResourceDictionary,ResourceDictionary,MergedDictionaries, MergeResourceInclude should be last in declaration order.If include shape/source is invalid, compiler reports transform diagnostics.
For external assembly includes, compiler attempts:
CompiledAvaloniaXaml.!AvaloniaResources public Build:<path> method,x:Class type) matching expected loaded type.If neither exists or types mismatch, compile-time transform error is produced.
Implication for library authors:
Expose controls with assembly attributes:
using Avalonia.Metadata;
[assembly: XmlnsDefinition("https://github.com/avaloniaui", "MyLibrary.Controls")]
[assembly: XmlnsPrefix("https://github.com/avaloniaui", "mylib")]
Then consumers can use:
xmlns:mylib="https://github.com/avaloniaui"
x:ClassModifier and CLR visibility matter:
AVLN3001 warning path).Use non-public XAML classes only when you do not need runtime URI-based construction from other assemblies.
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<EnableAvaloniaXamlCompilation>true</EnableAvaloniaXamlCompilation>
<AvaloniaUseCompiledBindingsByDefault>true</AvaloniaUseCompiledBindingsByDefault>
</PropertyGroup>
<ItemGroup>
<AvaloniaXaml Include="Themes/**/*.axaml" />
<AvaloniaResource Include="Assets/**" />
</ItemGroup>
</Project>
Example consumer usage:
<Application.Styles>
<StyleInclude Source="avares://MyLibrary/Themes/LibraryTheme.axaml" />
</Application.Styles>
avares://... URI.BaseUri on documents.ResourceDictionary, or order/source is invalid.XmlnsDefinition mapping or incorrect CLR namespace.