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

如何解决打包为NuGet的WPF自定义控件资源加载失败问题

WPF NuGet封装控件图片资源加载失败修复方案

问题根因

当前代码使用的Pack URI未指定资源所属程序集,WPF解析URI时默认从宿主启动程序集的资源清单中查找文件,无法定位NuGet包内Win10Themables程序集的嵌入图片,因此抛出资源找不到异常。
同解决方案下项目引用测试正常,是因为测试时控件项目本身为启动项,资源查找路径与URI匹配;打包为NuGet后宿主程序成为启动项,未指定程序集的URI会指向宿主程序路径,自然无法找到控件内置资源。

修复步骤

  • 修正图片加载的Pack URI
    将主题切换逻辑中的URI替换为带程序集限定的标准格式,明确指定资源所属程序集:
    ThemeImage = isThemeDark 
                ? new BitmapImage(new Uri(@"pack://application:,,,/Win10Themables;component/Images/Pallete_Light.png", UriKind.Absolute))
                : new BitmapImage(new Uri(@"pack://application:,,,/Win10Themables;component/Images/Pallete_Dark.png", UriKind.Absolute));
    

    该格式和你在App.xaml中合并资源字典的路径规则完全一致:/[程序集名];component/[程序集内资源相对路径],所有跨程序集引用的嵌入资源都需要遵循这个规则。

  • 确认资源嵌入配置
    保持两张主题图片的生成操作为Resource,不需要配置为复制到输出目录。如果使用SDK风格项目格式打包NuGet,可在打包完成后解压nupkg文件,反编译lib文件夹下对应目标框架的Win10Themables.dll,确认程序集资源清单中包含两张png文件,排除资源未被正确嵌入的问题。
  • 同步修正XAML中的资源引用(如适用)
    如果你在控件的资源字典XAML中直接引用了这两张图片,也需要同步修改为带程序集名的路径格式,避免XAML解析时找不到资源:
    <ImageSource x:Key="LightThemePalette">/Win10Themables;component/Images/Pallete_Light.png</ImageSource>
    <ImageSource x:Key="DarkThemePalette">/Win10Themables;component/Images/Pallete_Dark.png</ImageSource>
    

验证方式

重新打包NuGet并在宿主项目更新引用后启动,主题切换逻辑即可正常加载内置图片,无需在宿主项目中额外存放图片文件,也不需要修改资源复制配置。

内容的提问来源于stack exchange,提问作者user7199677

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 06:03:13