【问题标题】:Can I use WPF window constructor to change culture?我可以使用 WPF 窗口构造函数来更改文化吗?
【发布时间】:2012-01-20 11:32:18
【问题描述】:

我使用众所周知的 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);
        }

【问题讨论】:

  • 我可以向您推荐 wpflocalizeextension.codeplex.com 切换对我来说效果很好...
  • @chrfin 实际上我使用的是 Easy BAML。它也很好。我想要的是使用 wpf 组合框来切换语言。
  • 抱歉,“Easy BAML”无法为您提供帮助,因为我使用 LocalizeExtension 来做到这一点(在运行时)...
  • 查看我的答案以获取示例...

标签: c# .net wpf locbaml


【解决方案1】:

我为此使用LocalizeExtension

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

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

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

【讨论】:

  • 这很奇怪 - 我在几个应用程序中使用它。您是否创建了正确的资源? Resources.resx 用于英语,Resources.es.resx 用于西班牙语 aso。?
  • 是的,这是个问题。感谢兄弟对使用 WPF 本地化扩展项目 wpflocalizeextension.codeplex.com 的好建议
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多