首页 > 解决方案 > Resources.MergedDictionaries 需要在每个窗口加载时添加

问题描述

我最近完成了一个支持多语言的 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

解决方案


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

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

示例代码如下所示:

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

有关对象属性的进一步阅读,请参阅此MSDN页面。ResourcesApplication


推荐阅读