编程语言
首页 > 编程语言> > c#-在Metro中,如何获取所有国家/地区的列表?

c#-在Metro中,如何获取所有国家/地区的列表?

作者:互联网

在Metro中,CultureInfo.GetCultures方法不再存在.如果要检索所有可用国家/地区的字符串的完整列表,可以使用哪些替代方法?

解决方法:

请尝试一下:

    public class LocalesRetrievalException: Exception
    {
       public LocalesRetrievalException(string message): base(message)
       {
       }
    }

    #region Windows API

    private delegate bool EnumLocalesProcExDelegate(
       [MarshalAs(UnmanagedType.LPWStr)]String lpLocaleString,
       LocaleType dwFlags, int lParam);

    [DllImport(@"kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
    private static extern bool EnumSystemLocalesEx(EnumLocalesProcExDelegate pEnumProcEx,
       LocaleType dwFlags, int lParam, IntPtr lpReserved);

    private enum LocaleType : uint
    {
       LocaleAll = 0x00000000,             // Enumerate all named based locales
       LocaleWindows = 0x00000001,         // Shipped locales and/or replacements for them
       LocaleSupplemental = 0x00000002,    // Supplemental locales only
       LocaleAlternateSorts = 0x00000004,  // Alternate sort locales
       LocaleNeutralData = 0x00000010,     // Locales that are "neutral" (language only, region data is default)
       LocaleSpecificData = 0x00000020,    // Locales that contain language and region data
    }

    #endregion

    public enum CultureTypes : uint
    {
       SpecificCultures = LocaleType.LocaleSpecificData,
       NeutralCultures = LocaleType.LocaleNeutralData,
       AllCultures = LocaleType.LocaleWindows
    }

    public static IReadOnlyCollection<CultureInfo> GetCultures(
       CultureTypes cultureTypes)
    {
       List<CultureInfo> cultures = new List<CultureInfo>();
       EnumLocalesProcExDelegate enumCallback = (locale, flags, lParam) =>
       {
          try
          {
             cultures.Add(new CultureInfo(locale));
          }
          catch (CultureNotFoundException)
          {
             // This culture is not supported by .NET (not happened so far)
             // Must be ignored.
          }
          return true;
       };

       if (EnumSystemLocalesEx(enumCallback, (LocaleType)cultureTypes, 0, 
          (IntPtr)0) == false)
       {
          int errorCode = Marshal.GetLastWin32Error();
          throw new LocalesRetrievalException("Win32 error " + errorCode + 
             " while trying to get the Windows locales");
       }

       // Add the two neutral cultures that Windows misses 
       // (CultureInfo.GetCultures adds them also):
       if (cultureTypes == CultureTypes.NeutralCultures || 
          cultureTypes == CultureTypes.AllCultures)
       {
          cultures.Add(new CultureInfo("zh-CHS"));
          cultures.Add(new CultureInfo("zh-CHT"));
       }

       return new ReadOnlyCollection<CultureInfo>(cultures);
    }

参考:Replacement for CultureInfo.GetCultures in .NET Windows Store apps

标签:windows-8,microsoft-metro,c
来源: https://codeday.me/bug/20191031/1978736.html