Принудительное обновление пользовательского интерфейса после изменения текущей культуры в WPF

Мне нужно поддержать изменение языка интерфейса через меню приложения. Тексты локализуются с использованием файлов ресурсов (аналогично подходу 1 здесь)

если я установлю Thread.CurrentThread.CurrentUICulture до того, как ctor вызывает InitializeComponent()пользовательский интерфейс изменяется, как и должно быть.

Однако если CurrentUICulture изменяется во время обычного запуска приложения, элементы управления не обновляются (т. е. текст остается неизменным, независимо от текущей культуры).

Есть ли способ заставить элементы управления обновляться в соответствии с CurrentUICulture?

3 ответа

Решение

Вы могли бы использовать ResourceDictionary подход вместе с DynamicResourceMarkupExtension, Используя этот подход, вы можете заменить словарь ресурсов на язык, выбранный пользователем, и DynamicResourceMarkupExtension будет гарантировать, что новое значение отражается в пользовательском интерфейсе.

Кроме того, если вы готовы пойти в сферу индивидуального решения, есть LocalizeMarkupExtension который предоставляется в этом учебнике WPF.

Предполагая, что DataContext для меню является объектом, который реализует INotifyPropertyChanged, вы можете обновить все элементы управления, указав значение NULL (ничего) в событии PropertyChanged...

из MSDN:

Событие PropertyChanged может указывать, что все свойства объекта были изменены с использованием пустой ссылки (Nothing в Visual Basic) или String.Empty в качестве имени свойства в PropertyChangedEventArgs.

Способ, который я попробовал и работает хорошо, заключается в следующем: вызов метода после присвоения свойства во ViewModel:

private void AllowUiToUpdate()
{
    var frame = new DispatcherFrame();

    var dispatcherOperationCallback = new DispatcherOperationCallback(delegate
        {
            frame.Continue = false;
            return null;
        });

    Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Render, dispatcherOperationCallback, null);

    Dispatcher.PushFrame(frame);
}
Другие вопросы по тегам