我可以使用WPF窗口构造函数来改变文化吗?

时间:2012-01-20 11:32:18

标签: c# .net wpf locbaml

我使用众所周知的 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 Window类控制器下使用它时,它不起作用。

任何线索为什么会这样?


我使用它但它不起作用。

void cmbLanguages_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            string locale = "es-ES";
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(locale);
            Thread.CurrentThread.CurrentCulture = new CultureInfo(locale);
        }

2 个答案:

答案 0 :(得分:1)

我使用LocalizeExtension

在.xaml中,您只需使用{LocText NAMESPACE::RESOURCENAME}设置文本,并在以下代码中随意更改语言:

Thread.CurrentThread.CurrentCulture = culture;
Thread.CurrentThread.CurrentUICulture = culture;
LocalizeDictionary.Instance.Culture = culture;

您可以在我使用它的Codeplex上查看我的项目,以查看扩展示例:
XAMLCodeBehind( - > SetUICulture)

答案 1 :(得分:1)

如果您在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();
}