如何正确将XAML文件移动到文件夹并解决WPF资源引用报错问题
第一步:修正图片资源的URI格式(核心解决方法)
你遇到的是WPF相对资源URI的上下文匹配问题:WPF中相对URI的基准是当前调用该资源的XAML文件所在的文件夹,所以你在CustomImage内部使用时路径匹配可以正常加载,但是当CustomImage被其他文件夹下的UserControl引用时,相对路径的基准会变为外部UserControl的文件夹,就会找不到资源。
你需要把CustomImage中所有图片的URI改为固定的包URI(Pack URI),格式如下:
pack://application:,,,/[你的程序集名称];component/[图片在项目中的完整相对路径]
举个例子:如果你的程序集名称是WpfApp1,图片存放在项目的Assets/Images文件夹下名为icon.png,那么完整URI为:pack://application:,,,/WpfApp1;component/Assets/Images/icon.png
这种格式的URI不依赖当前XAML的位置,全局可用。
第二步:确认图片文件的属性配置
在解决方案资源管理器中选中所有用到的图片文件,右键查看属性,确认:
- 生成操作:设置为
资源 - 复制到输出目录:设置为
如果较新则复制或者不复制均可
第三步:检查控件命名空间引用
如果移动文件后修改了CustomImage所属的命名空间,你需要在引用CustomImage的其他UserControl的XAML头部,更新对应的xmlns命名空间声明,比如你把CustomImage移到了项目的Controls文件夹下,对应命名空间改为了WpfApp1.Controls,那么需要添加引用:xmlns:controls="clr-namespace:WpfApp1.Controls"
使用的时候就用<controls:CustomImage />即可。
第四步:清理项目缓存
如果修改后还是报错,直接删除项目根目录下的bin和obj文件夹,然后重新生成解决方案,避免Visual Studio缓存旧的资源配置导致异常。
关于自动生成代码的说明
你看到的InitializeComponent中的URI是XAML编译器自动生成的代码,存储在.g.cs后缀的自动生成文件中,手动修改确实会在编译时被覆盖,不需要手动修改这段代码,你把XAML中的路径配置正确后,这段代码会自动同步更新。
内容的提问来源于stack exchange,提问作者Noob001

