【问题标题】:Resources.MergedDictionaries need to be added on every window loadResources.MergedDictionaries 需要在每个窗口加载时添加
【发布时间】:2019-06-06 12:23:06
【问题描述】:

我最近完成了一个支持多语言的 WPF 应用程序。出于多语言的目的,我为每种语言创建了资源字典,并在控件上使用了动态资源键,如下所示:

<Label x:Name="lblUsername" {DynamicResource username}" />

在应用程序启动时,我要求用户从下拉列表中选择所需的语言,并在选择后将相关字典添加到资源中,如下所示:

        //remove old file
        foreach (ResourceDictionary langfile in Resources.MergedDictionaries)
        {
            if (langfile.Source.ToString().Contains("lang"))
            {
                Resources.MergedDictionaries.Remove(langfile);
                break;
            }
        }

        //add new file
        Resources.MergedDictionaries.Add(langfilename);

上面的代码用新选择的语言更新了窗口上的所有控件。但是每当我使用以下命令打开另一个窗口时,控件都会再次使用默认语言(英语)。

WinSettings win = new WinSettings() { Owner = Application.Current.Windows[0] };
win.Show();

要使其正常工作,我必须再次删除旧语言并将新语言添加到新窗口的“Window_Loaded”事件的 Resources.MergedDictionaries 中。

没有其他方法可以让我设置一次语言并在所有新窗口上复制吗?

【问题讨论】:

  • 你不能创建一个读取然后存储数据的单例类吗?
  • 您的意思是保留一个资源文件并在语言更改时以编程方式对其进行编辑?这是一个好习惯吗?

标签: c# wpf


【解决方案1】:

当您在 Window 中更新 Resources.MergedDictionaries 时,它会更新该特定窗口/元素的样式。

要获得整个应用程序的一致视觉外观,您应该更新Application 对象上的Resources.MergedDictionaries

示例代码如下所示:

Application.Current.Resources.MergedDictionaries.Add(langfilename);

请参阅此MSDN 页面以进一步了解Application 对象上的Resources 属性。

【讨论】:

    猜你喜欢
    • 2018-08-04
    • 1970-01-01
    • 2017-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-19
    相关资源
    最近更新 更多