如何实现MAUI与WPF之间的资源共享?
共享单个类库支持WPF和MAUI的解决方案
方案1:多目标框架编译(最推荐)
直接修改资源类库的.csproj文件,同时指定net7.0(供MAUI使用)和net7.0-windows(供WPF使用)两个目标框架,并针对WPF目标启用UseWpf:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFrameworks>net7.0;net7.0-windows</TargetFrameworks> <!-- 仅在WPF目标下启用UseWpf --> <UseWpf Condition="'$(TargetFramework)' == 'net7.0-windows'">true</UseWpf> <!-- 按需添加其他通用配置,比如Nullable、LangVersion等 --> </PropertyGroup> <!-- 保持原有的资源文件配置,图标导入脚本无需修改 --> <ItemGroup> <Page Include="**\*.xaml" /> </ItemGroup> </Project>
编译后会生成两个版本的程序集:
- WPF项目引用
net7.0-windows版本,依然可以用原有的Pack notation加载资源,完全兼容现有逻辑; - MAUI项目引用
net7.0版本,能正常读取嵌入的XAML资源。
整个过程不需要改动图标导入脚本,也不用调整WPF的资源加载代码,是最省心的方案。
方案2:调整资源嵌入与加载逻辑(适合不想多目标的场景)
如果坚持用纯net7.0共享库,需要修改资源的嵌入方式,并调整WPF端的资源加载代码:
- 修改类库
.csproj,将XAML资源设置为嵌入式资源:
<ItemGroup> <EmbeddedResource Include="**\*.xaml"> <LogicalName>%(RecursiveDir)%(Filename)%(Extension)</LogicalName> </EmbeddedResource> </ItemGroup>
- 在WPF项目中,替换原有的Pack URI加载方式,改用代码从程序集读取资源:
using System.IO; using System.Windows; using System.Windows.Markup; // 示例:加载LightTheme.xaml资源 var assembly = typeof(YourResourceMarkerClass).Assembly; var resourcePath = "YourLibraryNamespace.Icons.LightTheme.xaml"; using var stream = assembly.GetManifestResourceStream(resourcePath); if (stream != null) { var resourceDict = XamlReader.Load(stream) as ResourceDictionary; Application.Current.Resources.MergedDictionaries.Add(resourceDict); }
注意替换代码中的YourResourceMarkerClass和YourLibraryNamespace为实际的类名和命名空间。这个方案需要改动WPF的现有加载逻辑,但能保持类库单目标。
方案3:使用.NET Standard类库(兼容性备选)
将类库改为.NET Standard 2.1目标框架,同时确保资源以嵌入式方式包含。WPF(net7.0-windows)和MAUI都能引用.NET Standard类库,但同样需要调整WPF的资源加载逻辑(同方案2),因为.NET Standard类库不支持WPF的Pack notation原生加载。
内容的提问来源于stack exchange,提问作者AJ.
相关产品推荐
相关产品推荐

