Проблема локализации в метро
У меня очень странные проблемы во время игры с локализацией приложений в приложениях метро. В моем приложении запущена функция, я зарегистрировал событие смены языка приложения.
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();
}
...
}
Напечатано вручную, поэтому извиняюсь за любые опечатки.