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

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

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

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

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

Ответы [ 3 ]

10 голосов
/ 30 декабря 2009

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

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

2 голосов
/ 17 декабря 2009

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

из msdn :

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

0 голосов
/ 19 июня 2013

Способ, который я попробовал и который хорошо работает, заключается в следующем: вызов метода после присвоения свойства во 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...