Фактический вопрос должен быть следующим:
Как я могу перезагрузить пользовательский интерфейс после изменения культуры пользовательского интерфейса?
Свойство, которое влияет на пользовательский интерфейс, Thread.CurrentThread.CurrentUICulture
, не Thread.CurrentThread.CurrentCulture
.Вторая культура влияет на то, как строки анализируются или форматируются.CurrentUICulture
- это культура, используемая для загрузки локализованных ресурсов.
Изменение CurrentUICulture
не перезагрузка этих ресурсов.Вам придется явно перезагрузить или перезагрузить главное окно приложения.
Проверка Изменение культуры в WPF , написанное автором курса Pluralsight Введение в локализацию и глобализацию в .NET .Этот курс использует приложение WPF в качестве примера, поэтому обязательно ознакомьтесь с ним.Вы можете получить 3 месяца бесплатного доступа к курсам Pluralsight через бесплатное предложение Microsoft Visual Studio Dev Essentials .
В статье показано, как явно обрабатывать главное окно и перезагружать его, когдаКультура меняется.
App.xaml
модифицируется так, чтобы главное окно не открывалось автоматически.StartupUri удален из App.xaml and the
Событие OnStartup` обрабатывается для явного открытия главного окна.Это:
<Application x:Class="WpfLocalized.App"
...
StartupUri="MainWindow.xaml">
...
</Application>
Меняется на:
<Application x:Class="WpfLocalized.App"
...
>
...
</Application>
И следующий код добавляется в App.xaml.cs
:
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
Application.Current.MainWindow = new MainWindow();
Application.Current.MainWindow.Show();
}
public static void ChangeCulture(CultureInfo newCulture)
{
Thread.CurrentThread.CurrentCulture = newCulture;
Thread.CurrentThread.CurrentUICulture = newCulture;
var oldWindow = Application.Current.MainWindow;
Application.Current.MainWindow = new MainWindow();
Application.Current.MainWindow.Show();
oldWindow.Close();
}
}
Метод OnStartup
загружаетГлавное окно в первый раз.ChangeCulture
изменяет культуру, закрывает текущее окно и загружает его снова, перезагружая все ресурсы.
Чтобы изменить культуру и перезагрузить все, что нужно сделать, это вызвать App.ChangeCulture
, например:от нажатия кнопки:
private void AUButton_Click(object sender, RoutedEventArgs e)
{
App.ChangeCulture(new CultureInfo("en-AU"));
}
В примере статьи есть одно текстовое поле, значение которого загружается из ресурсов, и некоторые кнопки, которые изменяют культуру:
<TextBlock
Text="{x:Static resx:Resources.Greeting}"
HorizontalAlignment="Center" Padding="10,5"
Margin="5"/>
Каждый раз, когда окнозагружен, ресурс будет загружен из правильного файла на основе CurrentUICulture