如何通过代码向Avalonia UI的MergedDictionaries添加资源?
Avalonia代码动态加载资源字典的正确方法
你之前的代码没生效,主要是两个原因:一是没有显式触发资源加载,二是Uri格式不符合Avalonia的资源寻址规则。以下是两种可行的实现方式:
方法一:使用ResourceInclude并显式加载
// 清空现有合并资源字典 Application.Current?.Resources.MergedDictionaries.Clear(); // 构建资源Uri,替换YourAssemblyName为你的项目程序集名称 var resourceUri = new Uri("/YourAssemblyName;component/Assets/icons/LightIcons.axaml", UriKind.RelativeOrAbsolute); var resourceInclude = new ResourceInclude(resourceUri); // 显式加载资源(同步用Load(),异步用LoadAsync()) await resourceInclude.LoadAsync(); // 将加载后的资源添加到合并字典 Application.Current?.Resources.MergedDictionaries.Add(resourceInclude);
方法二:用AssetLoader直接加载ResourceDictionary
这是Avalonia推荐的资源加载方式,更简洁直接:
Application.Current?.Resources.MergedDictionaries.Clear(); // 使用avares协议指定资源路径,替换YourAssemblyName为你的项目程序集名称 var resourceDict = await AssetLoader.LoadAsync<ResourceDictionary>(new Uri("avares://YourAssemblyName/Assets/icons/LightIcons.axaml")); Application.Current?.Resources.MergedDictionaries.Add(resourceDict);
关键注意事项
- 确保目标
.axaml资源文件的生成操作设置为AvaloniaResource(右键文件→属性→生成操作),否则资源无法被程序识别加载。 - 替换代码中的
YourAssemblyName为你实际的项目程序集名称,可在项目属性的“应用”选项卡中查看。
内容的提问来源于stack exchange,提问作者RinF-UwU
相关产品推荐
相关产品推荐

