c# - 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 中。
有没有其他方法可以让我设置一次语言并在所有新窗口上复制?
解决方案
当您更新Resources.MergedDictionaries
时,Window
它会更新该特定窗口/元素的样式。
要获得整个应用程序的一致视觉外观,您应该更新Resources.MergedDictionaries
对象Application
。
示例代码如下所示:
Application.Current.Resources.MergedDictionaries.Add(langfilename);
有关对象属性的进一步阅读,请参阅此MSDN页面。Resources
Application
推荐阅读
- vba - 关闭时访问崩溃
- jquery - 如何在单个 Swiper Slider 上添加多个分页
- r - 具有 2 个组的叠加 ggplot2 条形图
- flutter - 如何在 Flutter 中扩展孩子的全宽?
- java - @JsonView 未传播到(“嵌套”)自定义序列化程序
- docker - 在 docker 容器内进行定期清理的最佳方法是什么?
- nuget - Azure Artifacts 的 Cake nuget 插件问题
- php - wordpress php无法将字符串与代码结合起来
- node.js - 等待将未定义返回到异步函数中(var all_courses 未定义)
- java - 将 JSON 格式的字符串转换为 java 中的 JSON 对象