CultureInfo в настройках. Дизайн - PullRequest
0 голосов
/ 02 мая 2020

Может быть, я делаю это неправильно. Но то, что мне нужно. У меня есть 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;
            }
        }
    }

Я не могу связать список nclacCultureInfos и настройки CurentLanguage. Нужно просмотреть только 2 культуры в раскрывающемся списке в таблице свойств, в идеале это будет CultureInfo.Name, как русский, Engli sh. Но в этот момент приложение отображает все возможные культуры в системе. Спасибо за помощь.

1 Ответ

0 голосов
/ 03 мая 2020

Вам необходимо иметь пользовательский 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;
    }
}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...