我可以使用WPF窗口构造函数来更改区域性吗
本文关键字:区域性 构造函数 可以使 WPF 窗口 我可以 | 更新日期: 2023-09-27 18:20:57
我使用众所周知的LocBaml方法来改变文化。
它在这里运行良好:
public App()
{
// Test code
bool override_current_ui_language = true;
string locale = "es-ES";
if (override_current_ui_language)
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo(locale);
Thread.CurrentThread.CurrentCulture = new CultureInfo(locale);
}
}
但当我在WPF窗口类控制器下使用相同的控件时,它就不起作用了。
知道为什么吗?
我用这个,但效果不太好。
void cmbLanguages_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
string locale = "es-ES";
Thread.CurrentThread.CurrentUICulture = new CultureInfo(locale);
Thread.CurrentThread.CurrentCulture = new CultureInfo(locale);
}
我使用LocalizeExtension。
在.xaml中,您只需使用{LocText NAMESPACE::RESOURCENAME}
来设置文本,并在下面的代码中动态更改语言:
Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = culture;
LocalizeDictionary.Instance.Culture = culture;
您可以在我使用它的Codeplex上查看我的项目,以查看扩展示例:
XAML和CodeBehind(->SetUICulture)
如果在InitalizeComponent()
调用之前执行,它应该在构造函数中工作,但您的示例显示了一个事件处理程序。一旦InitializeComponent()
被调用,BAML已经从资源中加载,您将无法更改它
您可以使用类似于此处所示的方法https://www.codeproject.com/articles/29800/webcontrols/用您的新文化创建一个新窗口:
void SwitchCulture(CultureInfo newCulture)
{
Thread.CurrentThread.CurrentUICulture = newCulture;
Thread.CurrentThread.CurrentCulture = newCulture;
// Reload all the merged dictionaries to reset the resources.
List<Uri> dictionaryList = new List<Uri>();
foreach (ResourceDictionary dictionary in Application.Current.Resources.MergedDictionaries)
{
dictionaryList.Add(dictionary.Source);
}
Application.Current.Resources.MergedDictionaries.Clear();
foreach (Uri uri in dictionaryList)
{
ResourceDictionary resourceDictionary1 = new ResourceDictionary();
resourceDictionary1.Source = uri;
Application.Current.Resources.MergedDictionaries.Add( resourceDictionary1 );
}
MyWindowClass newWindow = new MyWiondowClass();
// TODO: Attach any view model so the new window looks like the old one
newWindow.Show();
this.Close();
}