【问题标题】:What kind of "Key" do I need to supply when loading Resource Dictionaries?加载资源字典时需要提供什么样的“密钥”?
【发布时间】:2013-11-11 19:01:00
【问题描述】:

在尝试设置默认 ResourceDictionary 时,我收到以下警告:

设计器不支持加载混合 'ResourceDictionary' 没有键的项目和其他项目相同 收藏。请确保“资源”属性不 包含没有键的“ResourceDictionary”项目,或者 'ResourceDictionary' 项是集合中的唯一元素。

这是我在 App.xaml 文件中使用的代码,收到了上述警告:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Lang.en-US.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

这与我在 Visual Studio 2008 中设置 ResourceDictionary 时使用的代码完全相同。我现在使用的是 VS 2010。我需要提供什么 Key 以使其正常工作ResourceDictionary ?

这是我目前正在与此代码一起测试的 MainWindow.xaml 中的行:

<MenuItem Header="{DynamicResource new_test}" />

【问题讨论】:

  • 您在应用程序中有更多资源,还是这样?
  • 我有不止一个。但是当我在 VS 2008 中使用这种方法时也是这种情况,并且有效
  • 尝试将x:Key 赋予您的根元素ResourceDictionary 就在Application.Resources 下方。
  • 你也可以展示一下吗?
  • @RohitVats 如果我给ResourceDictionary x:Key 我将其设置为什么? (x:Key="?")。如果你需要的话,我可以给你看字典。

标签: c# wpf xaml resourcedictionary


【解决方案1】:

由于您尚未发布完整的 XAML 文件,我怀疑您的资源部分中除了合并字典之外还有其他资源。

根据MSDN -

在 ResourceDictionary 中定义资源是合法的 指定为合并字典,或者作为替代 指定 Source,或者除了包含的任何资源之外 从指定的来源。但是,这不是常见的情况;这 合并字典的主要场景是从 外部文件位置。如果要在 页面的标记,您通常应该在 main 中定义这些 ResourceDictionary 而不是在合并的字典中。

尝试在单独的资源字典中移动其他资源,并确保所有其他资源都设置了x:Key -

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Lang.en-US.xaml" />
        </ResourceDictionary.MergedDictionaries>
        <ResourceDictionary>
             <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter"/>
             <ContextMenu x:Key="MyContextMenu"/>
        </ResourceDictionary>
    </ResourceDictionary>
</Application.Resources>

【讨论】:

  • 我需要让Application.Resources下的每个项目都有自己的ResourceDictionary吗?
  • 不,除了合并字典外,将所有其他资源包装在单个 ResourceDictionary 下,就像我将 contextMenu 和转换器包装在单个字典下一样。仅将所有其他资源放在此字典下。
  • 并保持MergedDictionaries 由它自己的ResourceDictionary 包裹?
  • 是的,就像我在答案中提到的那样。
  • 或者简单地将所有其他资源放在父ResourceDictionary 中,就在Application.Resources 之后。我怀疑其他资源位于 ResourceDictionary 之外。
【解决方案2】:

使用资源文件进行翻译。它比资源字典好。

这是一个例子:

这样设置前缀以便在 xaml 中使用。

xmlns:const="clr-namespace:FileExplorer.Properties"

资源位于属性中。

要在 XAML 中使用它们,您需要满足以下条件:

<TextBox Text="{x:Static const:Resources.Window_Title_String}"/>

如果您有不同的语言,请按照命名约定为每种语言创建自己的资源文件。

例如:

Resources.resx (this will be default)
Resources.de-DE.resx (this is for german)

现在您只需将当前文化设置为德语,您的应用程序就会使用德语,并且会自动使用正确的资源文件。

在 Main 方法中这样:

Thread.CurrentThread.CurrentUICulture = new CultureInfo("de-DE");

【讨论】:

    猜你喜欢
    • 2010-10-03
    • 2013-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-19
    • 1970-01-01
    • 2021-08-02
    • 2022-06-30
    相关资源
    最近更新 更多