Можно ли использовать конструктор окон WPF для изменения культуры? - PullRequest
2 голосов
/ 20 января 2012

Я использую хорошо известный 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);
        }

Ответы [ 2 ]

1 голос
/ 14 июля 2018

Он должен работать в конструкторе , если вы делаете это до вызова 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();
} 
1 голос
/ 20 января 2012

Я использую LocalizeExtension для этого.

В .xaml вы просто используете {LocText NAMESPACE::RESOURCENAME}, чтобы установить текст, и в коде ниже, чтобы изменить язык на лету:

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

Вы можете проверить мой проект на Codeplex, где я его использую, чтобы увидеть расширенный пример:
XAML и CodeBehind (-> SetUICulture)

...