1

我需要从 UWP 应用程序生成一个 .CSV 文件,所以我使用的是 TextInfo.ListSeparator。

我发现系统设置与代码返回的值不一致。

使用区域设置

在此处输入图像描述

使用 TextInfo 类

TextInfo textInfo = System.Globalization.CultureInfo.CurrentCulture.TextInfo;
System.Diagnostics.Debug.WriteLine(textInfo.CultureName);
System.Diagnostics.Debug.WriteLine(textInfo.IsReadOnly);
System.Diagnostics.Debug.WriteLine(textInfo.ListSeparator);
System.Diagnostics.Debug.WriteLine(textInfo.IsRightToLeft);

在此处输入图像描述

我的系统配置:

  • Windows 显示语言:英语(美国)
  • 地区格式:葡萄牙语(巴西)
  • 地区家所在地:美国

已编辑 按照一些答案的建议,我重新启动了我的电脑。然后编写了一个 UWP 和一个使用相同代码的 Windows 窗体应用程序。为了比较,我运行了一个 Windows PowerShell。这些值仍然不同,如下图所示。

在此处输入图像描述

PowerShell 和 Windows 窗体返回了预期的结果,但 UWP 失败。

4

2 回答 2

3

这对我有用。

我认为这是因为您在更改设置后没有重新打开您的视觉工作室。

更改设置后,它不会通知并强制已打开的 Visual Studio(或其他应用程序)更改其环境值。您必须关闭并重新打开您的 Visual Studio 才能让 Visual Studio 以新设置开始。

[更新]

我让它工作了,因为我认为您只想更改 ListSeparator 设置但没有更改 Region 格式。@user5596450 方向正确。所以你的问题的答案是否定的。您无法获取您在区域设置中指定的自定义区域格式。

实际上,自定义设置并非适用于所有设备系列。我相信目前的结果是有道理的。您所期望的应该由诸如 UWP 的桌面扩展之类的东西提供,而不是 .net 核心 API。您可以随时向 wpdev.uservoice.com 提出请求,Microsoft 正在那里听取开发人员的反馈。

作为替代方案,.Net 核心 API 将检查 UWP 应用程序的 PreferredLanguage 并为您获取相应的设置。例如,如果您Windows.Globalization.ApplicationLanguages.PrimaryLanguageOverride = "pt-br";在 UWP 应用程序中调用(通常在 App.xaml.cs 中的 OnLaunched 事件中),您将得到您所期望的,但这不是您在区域设置中自定义的设置。这就是它应该如何适用于不同设备系列的通用应用程序。请查看ApplicationLanguages.PrimaryLanguageOverride MSDN 文档以了解它的实际作用。

仅供参考,UWP 使用的 .net 核心 API 中的 CurrentCulture 可以在github上找到。以下是它的实现方式:

public static CultureInfo CurrentCulture
{
    get
    {
        Contract.Ensures(Contract.Result<CultureInfo>() != null);

#if !FEATURE_CORECLR
        return Thread.CurrentThread.CurrentCulture;
#else
                // In the case of CoreCLR, Thread.m_CurrentCulture and
                // Thread.m_CurrentUICulture are thread static so as not to let
                // CultureInfo objects leak across AppDomain boundaries. The
                // fact that these fields are thread static introduces overhead
                // in accessing them (through Thread.CurrentCulture). There is
                // also overhead in accessing Thread.CurrentThread. In this
                // case, we can avoid the overhead of Thread.CurrentThread
                // because these fields are thread static, and so do not
                // require a Thread instance to be accessed.
#if FEATURE_APPX
                if(AppDomain.IsAppXModel()) {
                    CultureInfo culture = GetCultureInfoForUserPreferredLanguageInAppX();
                    if (culture != null)
                        return culture;
                }
#endif
                return Thread.m_CurrentCulture ??
                    s_DefaultThreadCurrentCulture ??
                    s_userDefaultCulture ??
                    UserDefaultCulture;
#endif
    }

    set
    {
#if FEATURE_APPX
                    if (value == null) {
                        throw new ArgumentNullException("value");
                    }                    

                    if (AppDomain.IsAppXModel()) {
                        if (SetCultureInfoForUserPreferredLanguageInAppX(value)) {
                            // successfully set the culture, otherwise fallback to legacy path
                            return; 
                        }
                    }
#endif
        Thread.CurrentThread.CurrentCulture = value;
    }
}
于 2015-11-23T15:11:06.083 回答
1

上面的答案可能是正确的。然而,更可能的原因是 Win32 或系统 API 使用基于特定区域格式设置(在本例中为 pt-BR)的区域设置数据,即“;”。UWP 使用 WinRT API,它使用基于 Windows 显示语言(在本例中为 en-US)的区域设置数据,即“,”。

于 2015-11-23T18:15:55.877 回答