如何解决打包为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
相关产品推荐
相关产品推荐

