Можно ли использовать конструктор окон WPF для изменения культуры?
Я использую хорошо известный подход 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 ответа
Я использую 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();
}