You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现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端的资源加载代码:

  1. 修改类库.csproj,将XAML资源设置为嵌入式资源:
<ItemGroup>
  <EmbeddedResource Include="**\*.xaml">
    <LogicalName>%(RecursiveDir)%(Filename)%(Extension)</LogicalName>
  </EmbeddedResource>
</ItemGroup>
  1. 在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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 21:40:58