加载资源字典时我需要提供什么样的“密钥”?

时间:2013-11-11 19:01:00

标签: c# wpf xaml resourcedictionary

在尝试设置默认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}" />

2 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

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

以下是一个例子:

在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");