Settings.Designer 中的文化信息

CultureInfo in Settings.Designer

也许我做错了。但我需要什么。 我的应用程序中有 2 种文化 我想在设置中选择语言并添加下一个代码:

internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
    {
        private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));

        private static List<CultureInfo> nclacCultureInfos = new List<CultureInfo>()
        {
            CultureInfo.GetCultureInfo("ru-RU"),
            CultureInfo.GetCultureInfo("en-US")
        };

        [global::System.Configuration.UserScopedSetting()]
        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
        [global::System.Configuration.DefaultSettingValueAttribute("")]
        [Category("Main Settings")]
        [DisplayName("Default Language")]
        public CultureInfo CurentLanguage
        {
            get
            {
                return ((CultureInfo)(this["CurentLanguage"]));
            }
            set
            {
                this["CurentLanguage"] = value;
            }
        }
    }

我无法 link nclacCultureInfos 列表和设置 CurentLanguage。只需要在 propertygrid 的下拉列表中浏览 2 种文化,理想情况下它将是 CultureInfo.Name,如俄语、英语。但此时应用程序在系统中显示所有可能的文化。感谢您的帮助。

您需要有一个自定义的 UITypeEditor。

public class CultureInfoEditor : UITypeEditor
{
    private static List<CultureInfo> nclacCultureInfos = new List<CultureInfo>()
    {
        CultureInfo.GetCultureInfo("ru-RU"),
        CultureInfo.GetCultureInfo("en-US")
    };

    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
    {
        return UITypeEditorEditStyle.DropDown;
    }

    IWindowsFormsEditorService currentService;

    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
    {
        currentService = (IWindowsFormsEditorService)
            provider.GetService(typeof(IWindowsFormsEditorService));

        ListBox cultures = new ListBox();
        cultures.Items.Add(nclacCultureInfos[0].DisplayName);
        cultures.Items.Add(nclacCultureInfos[1].DisplayName);
        cultures.Text = ((CultureInfo)(context.Instance as Settings)["CurentLanguage"]).DisplayName;
        cultures.Dock = DockStyle.Top;
        cultures.MouseClick += cultures_MouseClick;
        currentService.DropDownControl(cultures);

        return nclacCultureInfos[cultures.SelectedIndex];
    }

    void cultures_MouseClick(object sender, MouseEventArgs e)
    {
        currentService.CloseDropDown();
    }
}

并且应该为我们的属性指定这个编辑器:

[global::System.Configuration.UserScopedSetting()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
[Category("Main Settings")]
[DisplayName("Default Language")]
[Editor(typeof(CultureInfoEditor), typeof(UITypeEditor))] // THIS LINE HAS BEEN ADDED
public CultureInfo CurentLanguage
{
    get
    {
        return ((CultureInfo)(this["CurentLanguage"]));
    }
    set
    {
        this["CurentLanguage"] = value;
    }
}

希望对您有所帮助。