【问题标题】:Localization issue in MetroMetro中的本地化问题
【发布时间】:2014-09-03 16:20:38
【问题描述】:

在 Metro 应用程序中使用应用程序本地化时,我遇到了一个非常奇怪的问题。在我的应用启动功能中,我已经注册了应用语言更改事件。

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);

这可以正常工作并在 Windows 8.1 中调用 MapChanged 事件,但是当我在 Windows 8.0 中测试相同的应用程序时,它无法正常工作。我调试了这个问题,发现 MapChanged 事件有时在PrimaryLanguageOverride 更改时不会触发,有时它会触发。这是windows的问题还是我做错了什么。

【问题讨论】:

  • 请给我一个拒绝投票的理由。

标签: c# windows-8 microsoft-metro windows-8.1


【解决方案1】:

由于支持多个视图,资源上下文在 Windows 8.1 中的工作方式略有不同。您应该使用 ResourceContext.GetForCurrentView() 返回的上下文,而不是 DefaultContext。您需要将上下文保存在静态或实例变量中,以免超出范围。所以:

class MyClass {
    private ResourceContext m_context;

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

手写输入,如有错误请见谅。

【讨论】:

    【解决方案2】:

    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 属性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-16
      • 1970-01-01
      • 1970-01-01
      • 2010-10-05
      • 2012-03-26
      • 1970-01-01
      相关资源
      最近更新 更多