加载指定文件夹ResourceDictionary报错:URI资源不可用的原因求助
为什么加载WPF语言ResourceDictionary时出现"资源不可用"错误?
你遇到的这个错误:
System.Exception: 'A resource identified by the URI' ..\Resources\Languages\it.xaml 'is not available for the' System.Windows.ResourceDictionary 'component.'
通常由以下几个常见原因导致,我来逐个分析并给出解决办法:
1. URI路径格式或上下文错误
你当前使用的是文件系统风格的相对路径"..\\Resources\\Languages\\it.xaml",但WPF应用运行时,资源文件是嵌入到程序集(Assembly)中的,而非以独立文件形式存在,这种路径写法会导致WPF无法正确定位资源。
解决办法:改用WPF标准的Pack URI或者基于程序集根目录的相对URI:
- 简化相对URI(适用于当前程序集内的资源):
"/Resources/Languages/it.xaml"(注意开头的斜杠,表示从程序集根目录开始) - 完整Pack URI写法:
"pack://application:,,,/Resources/Languages/it.xaml",这种写法更明确,适合跨程序集场景
2. 资源文件的生成操作设置错误
如果你的.xaml资源文件没有被正确标记为嵌入资源,编译后不会被包含到程序集里,自然无法被加载。
检查步骤:
- 在Visual Studio中右键点击
it.xaml或en.xaml文件,选择属性 - 确认生成操作(Build Action)设置为
Resource,而不是Content、None或其他选项 - 保存设置后重新编译项目
3. 相对路径的基准上下文不符合预期
你代码中的..\\表示当前目录的上一级,如果这段代码是在App.xaml.cs或项目根目录下的代码文件中执行,..\\会指向项目目录的上级,而你的资源文件实际位于项目根目录下的Resources/Languages文件夹,所以这个路径本身就是错误的,应该去掉..\\部分。
修正后的示例代码
var dict = new ResourceDictionary(); string currentLang = "it-IT"; CultureInfo targetCulture; Uri resourceUri; if (currentLang == "it-IT") { targetCulture = CultureInfo.CreateSpecificCulture("it"); // 使用基于程序集根目录的相对URI resourceUri = new Uri("/Resources/Languages/it.xaml", UriKind.Relative); } else { targetCulture = CultureInfo.CreateSpecificCulture("en"); resourceUri = new Uri("/Resources/Languages/en.xaml", UriKind.Relative); } // 注意:同时设置CurrentUICulture,WPF的资源绑定会优先使用这个属性 CultureInfo.CurrentCulture = targetCulture; CultureInfo.CurrentUICulture = targetCulture; try { Application.LoadComponent(dict, resourceUri); // 将加载的字典合并到应用全局资源中 Application.Current.Resources.MergedDictionaries.Add(dict); } catch (Exception ex) { // 可添加日志记录便于排查 Console.WriteLine($"加载语言资源失败:{ex.Message}"); }
额外检查点
- 确认资源文件的路径拼写完全正确(包括文件夹名称、文件名的大小写,虽然Windows平台不区分,但跨平台场景需要注意)
- 如果你的资源文件位于另一个类库程序集中,需要在Pack URI中指定程序集名称,例如:
"pack://application:,,,/YourClassLibraryName;component/Resources/Languages/it.xaml"
内容的提问来源于stack exchange,提问作者Steven
相关产品推荐
相关产品推荐

