Проблема локализации в метро

У меня очень странные проблемы во время игры с локализацией приложений в приложениях метро. В моем приложении запущена функция, я зарегистрировал событие смены языка приложения.

ResourceManager.Current.DefaultContext.QualifierValues.MapChanged += QualifierValues_MapChanged;

private void QualifierValues_MapChanged(IObservableMap<string, string> sender, IMapChangedEventArgs<string> @event)
    {
        ResourceManager.Current.DefaultContext.Reset();
    }

я имею ComboBox контроль, который содержит языки. Когда пользователь выбирает любой язык, я переопределяю язык по умолчанию, как показано на рисунке.

Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = new System.Globalization.CultureInfo((string)((ComboBoxItem)e.AddedItems[0]).Tag);

Это работает нормально и вызывает событие MapChanged в Windows 8.1, но когда я тестирую то же приложение в Windows 8.0, оно не работает должным образом. Я отладил эту проблему и обнаружил, что событие MapChanged иногда не срабатывает, когда PrimaryLanguageOverride изменить и иногда это огонь. Это проблема с окнами, или я делаю что-то не так.

2 ответа

Событие MapChanged наступает в потоке, отличном от потока пользовательского интерфейса, поэтому вы должны сделать что-то вроде следующего, чтобы убедиться, что используется поток пользовательского интерфейса:

ResourceManager.Current.DefaultContext.QualifierValues.MapChanged += async (s, m) =>
{
    await Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, () =>
    {
        ResourceManager.Current.DefaultContext.Reset();
        // other update code like myLabel.Text = ...
    });
};

где Dispatcher - это, например, свойство Dispatcher текущей страницы.

Контекст ресурса работает немного по-другому в Windows 8.1 из-за поддержки нескольких представлений. Вместо DefaultContext вы должны использовать контекст, возвращаемый ResourceContext.GetForCurrentView(). Вы захотите сохранить контекст в статической переменной или переменной экземпляра, чтобы он не выходил за рамки видимости. Так:

class MyClass {
    private ResourceContext m_context;

    public MyClass()
    {
        m_context = ResourceContext.GetForCurrentView();
        m_context.QualifierValues.MapChanged += QualifierValues_MapChanged();
    }
    ...
}

Напечатано вручную, поэтому извиняюсь за любые опечатки.

Другие вопросы по тегам