【问题标题】:XAML ResourceDictionary not loading correctly with a single keyset [duplicate]XAML ResourceDictionary 无法使用单个键集正确加载 [重复]
【发布时间】:2017-05-30 15:32:10
【问题描述】:

我一直在开发 WPF 应用程序,并且遇到了一些与我的 App.XAML 文件的 Application.Resources 元素中定义的资源有关的相当奇怪的行为。

我真的只需要在我的 ResourceDictionary 中定义一个字符串资源,我尝试使用以下 XAML:

<Application x:Class="MyClass.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:sys="clr-namespace:System;assembly=mscorlib">
    <Application.Resources>
        <sys:String x:Key="htmlHelpFilePath">.\Help\glossary.chm</sys:String>
    </Application.Resources>
</Application>

然后尝试使用以下代码访问它:

ResourceDictionary resourceDictionary = App.Current.Resources;
string htmlHelpFile = (string)resourceDictionary["htmlHelpFilePath"];

不幸的是,这导致htmlHelpFile 被设置为空。调试器还显示resourceDictionary 的键集为零。

我开始玩弄,发现只需将另一个资源添加到我的 Application.Resource XAML 元素中就可以正确填充字典,所以我最终解决了:

<Application.Resources>
    <sys:String x:Key="htmlHelpFileName">glossary.chm</sys:String>
    <sys:String x:Key="htmlHelpFileDirectory">.\Help\</sys:String>
</Application.Resources>

此解决方案按预期工作,我已继续我的工作,但我绝对对为什么这种行为以它发生的方式发生感到困惑。我对 XAML 配置的 WPF 应用程序的内部工作原理的了解非常基础,我很想知道这种奇怪行为的原因。

【问题讨论】:

  • 第二种情况下如何检索资源?
  • @Sinatr 是的,当我尝试访问包含这两个资源的资源时,我在实际 C# 代码中收到了预期的字符串
  • 您使用的是哪个 .NET Framework 版本?
  • @IIVic 我在这个项目中使用(并且仅限于)3.5
  • 是的,声誉……还有劳动力。不,jk。我会写一个答案 :) 顺便说一句,我再次检查了 Microsoft Connect 问题——它被关闭为“无法修复”... :(

标签: c# wpf xaml resourcedictionary


【解决方案1】:

这是一个已知的错误。 Ben Gribaudo 在他的博客上写了关于这个问题的文章 (link to full blog post)。引用这篇文章的相关内容:

[...]

在程序的 App.xaml 文件中:

  • 标签没有 StartupUri 属性。 (相反,程序的初始窗口是由覆盖启动的 App.xaml.cs 中应用程序的 OnStartup 方法。)
  • 包含只有一个条目

[...]

Visual Studio 会自动生成一个名为 App.g.cs 的隐藏文件,它将 App.xaml “连接”到应用程序中。当存在上述两个因素时,代码生成器有时无法将加载 内容的代码插入到应用程序中。如果不发生此加载,则程序中的其他 XAML 文件将无法使用 中定义的资源。

(强调我的)

Microsoft Connect 也有此问题的记录 (link);但是负责的开发团队已将其声明为“无法修复”。

还有一个 StackOverflow 问题,其中包含许多讨论不同可能解决方法的答案:App.xaml file does not get parsed if my app does not set a StartupUri?

您自己已经发现了一个解决方法——通过简单地添加第二个(虚拟)资源来避免资源字典中只有一个资源。

【讨论】:

  • 感谢您发布此内容,但对“无法修复”状态感到沮丧.. :/
  • 好吧,考虑到变通办法既简单又多,我猜,错误修复的风险可能会破坏其他事情以及实现它所需的努力在开发团队看来可能是不合理的。不过,如果 VS 团队至少能提供一些检查器来警告它是否在项目中发现了这些特定条件,那就太好了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-26
  • 1970-01-01
  • 2012-05-25
  • 1970-01-01
  • 1970-01-01
  • 2018-01-26
相关资源
最近更新 更多