UWP-语言更改

时间:2019-02-20 15:06:24

标签: c# multithreading uwp

我正在尝试在UWP应用程序中更改语言,以便与我的x:uid对象和基于ResourceLoader的对象相关的更改。 我正在使用,如其他常见问题解答所建议的那样:

ApplicationLanguages.PrimaryLanguageOverride = newLanguage;
Windows.ApplicationModel.Resources.Core.ResourceContext.GetForCurrentView().Reset();
Windows.ApplicationModel.Resources.Core.ResourceContext.GetForViewIndependentUse().Reset();
Frame.Navigate(this.GetType());

但是,由ResourceLoader直接控制的所有内容均已更改,而在xaml上使用x:uid创建的任何内容均未更改。如果我再次更改语言,则x:uid会更改为先前的语言,其余语言将为新选择的语言。

我认为可能与线程行为有关的某些原因有两个。首先,一个可行的修复建议是在导航之前延迟线程。其次,我在虚拟机和物理机上的行为不同(此错误显然发生在物理机上)。

我真的很感激一个解决方案或一个解释,该解决方案或解释提出了不基于延迟线程的良好功能。

其他一些相关的问答:

UWP MVVM: refresh page after change of language

C# change app language programmatically UWP realtime

谢谢

1 个答案:

答案 0 :(得分:1)

我已经报告了此问题,目前存在一种解决方法,该方法可以在调用Reset方法之后使用延迟。您可以参考以下代码。

using System.Threading.Tasks;

static bool m_bFirstLanguageChangeNavigation = true;


async private void Show_Click(object sender, RoutedEventArgs e)
{
    var context = ResourceContext.GetForCurrentView();
    var selectedLanguage = MyComboBox.SelectedValue;
    var lang = new List<string>();
    lang.Add(selectedLanguage.ToString());
    ApplicationLanguages.PrimaryLanguageOverride = selectedLanguage.ToString();
    ResourceContext.GetForCurrentView().Reset();
    ResourceContext.GetForViewIndependentUse().Reset();


    //added to work the first time
   if (m_bFirstLanguageChangeNavigation)
    {
       m_bFirstLanguageChangeNavigation = false;
       await Task.Delay(100);
    }


    Frame.Navigate(this.GetType());               
}