C# 地铁中的本地化问题
我在metro应用程序中玩应用程序本地化时遇到了一个非常奇怪的问题。在我的应用程序启动功能中,我已注册应用程序语言更改事件C# 地铁中的本地化问题,c#,windows-8,microsoft-metro,windows-8.1,C#,Windows 8,Microsoft Metro,Windows 8.1,我在metro应用程序中玩应用程序本地化时遇到了一个非常奇怪的问题。在我的应用程序启动功能中,我已注册应用程序语言更改事件 ResourceManager.Current.DefaultContext.QualifierValues.MapChanged += QualifierValues_MapChanged; private void QualifierValues_MapChanged(IObservableMap<string, string> sender, IMapC
ResourceManager.Current.DefaultContext.QualifierValues.MapChanged += QualifierValues_MapChanged;
private void QualifierValues_MapChanged(IObservableMap<string, string> sender, IMapChangedEventArgs<string> @event)
{
ResourceManager.Current.DefaultContext.Reset();
}
这可以正常工作,并在Windows 8.1中调用MapChanged事件,但当我在Windows 8.0中测试同一应用时,它无法正常工作。我调试了这个问题,发现MapChanged事件有时在
PrimaryLanguageOverride
change时不会触发,有时会触发。这是windows的问题还是我做错了什么。由于支持多视图,资源上下文在windows 8.1中的工作方式略有不同。您应该使用ResourceContext.GetForCurrentView()返回的上下文,而不是DefaultContext。您需要将上下文保存在静态变量或实例变量中,以便它不会超出范围。因此:
class MyClass {
private ResourceContext m_context;
public MyClass()
{
m_context = ResourceContext.GetForCurrentView();
m_context.QualifierValues.MapChanged += QualifierValues_MapChanged();
}
...
}
手动键入,因此对于任何键入错误表示歉意。MapChanged事件发生在用户界面线程以外的线程上,因此您必须执行以下操作,以确保使用UI线程:
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属性。请给我一个否决投票的原因。
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 = ...
});
};