如何在WPF中设计时显示多语言资源文本

时间:2017-01-31 15:27:12

标签: c# wpf xaml resourcedictionary

我正在使用WPF应用程序,该应用程序应该是多语言的。 所以我按照这个article中的步骤添加了一些资源词典到我的项目中。 然后我通过以下方法将这些词典中的一个添加到窗口中,我在窗口的构造函数中调用 - 用于测试目的:

    private void SetLanguageDictionary()
    {
        ResourceDictionary dict = new ResourceDictionary();

        switch (Thread.CurrentThread.CurrentCulture.ToString())
        {
            case "en-US":
            case "en-GB":
                dict.Source = new Uri("Resources\\StringResources_en-US.xaml",
                              UriKind.Relative);
                break;
            case "de-DE":
                dict.Source = new Uri("Resources\\StringResources_de-DE.xaml",
                                  UriKind.Relative);
                break;
            default:
                dict.Source = new Uri("Resources\\StringResources_de-DE.xaml",
                                  UriKind.Relative);
                break;
        }

        Resources.MergedDictionaries.Add(dict);
    }

最后,我在窗口上的标签中实现了这样的资源:

    <Label Grid.Row="0"
           Grid.Column="0"
           Margin="5"
           Content="{DynamicResource firstname}"></Label>

如果我电脑上的当前文化是&#34; en-US&#34;内容将是&#34;名字&#34;。 或者在&#34; de-DE&#34; (德语)&#34; Vorname&#34;。

在运行时它工作正常,但在设计时我无法看到文本。

我该怎么办?

1 个答案:

答案 0 :(得分:0)

我找到了。

我必须在Window.Resources中实现ResourceDictionary。 为此,必须添加一些标签(“ResourceDictionary”,“ResourceDictionary.MergedDictionaries”)。

如果定义了样式,则必须将它们移动到标记“ResourceDictionary”中,如下所示。

<Window.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Resources/StringResources_en-US.xaml"/>
        </ResourceDictionary.MergedDictionaries>

        <Style x:Key="style1">
            [...]
        </Style>

        [...]
    </ResourceDictionary>
</Window.Resources>

然后您可以在控件中看到xaml文件中的文本作为动态资源绑定到它。 因为它被用作动态资源,所以可以在代码隐藏中覆盖它:

        ResourceDictionary dict = new ResourceDictionary();
        dict.Source = new Uri("Resources\\StringResources_de-DE.xaml",
                                  UriKind.Relative);
        Resources.MergedDictionaries.Add(dict);