Свойство Visual Studio Design Time - выпадающий список форм - PullRequest
5 голосов
/ 03 мая 2010

[РЕДАКТИРОВАТЬ] Чтобы было ясно, я знаю, как получить список форм с помощью отражения. Меня больше волнует сетка свойств времени проектирования.

У меня есть пользовательский элемент управления с открытым свойством типа Form.
Я хочу иметь возможность выбрать форму во время разработки из раскрывающегося списка.
Я хочу заполнить выпадающий список форм из заданного пространства имен: UI.Foo.Forms

Это будет работать, как если бы у вас было публичное свойство Control. Во время разработки свойство автоматически заполнит раскрывающийся список всеми элементами управления в форме, из которых вы сможете выбрать. Я просто хочу заполнить его всеми формами в пространстве имен.

Как мне это сделать? Я надеюсь, что я достаточно ясен, чтобы не было путаницы. Я ищу несколько примеров кода, если это вообще возможно. Я стараюсь избегать того, чтобы тратить на это слишком много времени, когда у меня есть другие сроки выполнения.

Заранее спасибо за помощь.

Ответы [ 2 ]

7 голосов
/ 06 мая 2010

Вы можете легко получить классы с помощью Reflection:

var formNames = this.GetType().Assembly.GetTypes().Where(x => x.Namespace == "UI.Foo.Forms").Select(x => x.Name);

Предполагая, что вы вызываете это из кода в той же сборке, что и ваши формы, вы получите имена всех типов в пространстве имен "UI.Foo.Forms". Затем вы можете представить это в раскрывающемся списке и, в конце концов, создать экземпляр того, что выберет пользователь через отражение еще раз:

Activator.CreateInstance(this.GetType("UI.Form.Forms.FormClassName"));

[Редактировать] Добавление кода для времени разработки:

На вашем контроле вы можете создать свойство формы следующим образом:

[Browsable(true)]
[Editor(typeof(TestDesignProperty), typeof(UITypeEditor))]
[DefaultValue(null)]
public Type FormType { get; set; }

Который ссылается на тип редактора, который должен быть определен. Код довольно понятен, с минимальной настройкой, вы, вероятно, сможете заставить его производить именно то, что вы хотите.

public class TestDesignProperty : UITypeEditor
{
    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
    {
        return UITypeEditorEditStyle.DropDown;
    }

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

        ListBox lb = new ListBox();
        foreach(var type in this.GetType().Assembly.GetTypes())
        {
            lb.Items.Add(type);
        }

        if (value != null)
        {
            lb.SelectedItem = value;
        }

        edSvc.DropDownControl(lb);

        value = (Type)lb.SelectedItem;

        return value;
    }
}
2 голосов
/ 05 февраля 2013

Раскрывающийся список не закрывается, когда элемент выбирается нажатием на него, поэтому это может быть полезно:

назначить обработчик события щелчка для списка и добавить функцию обработчика события

public class TestDesignProperty : UITypeEditor
{

    // ...

    IWindowsFormsEditorService editorService;

    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
        {
            // ...
            editorService = edSvc ; // so can be referenced in the click event handler

            ListBox lb = new ListBox();
            lb.Click += new EventHandler(lb_Click);
            // ... 
        }



    void lb_Click(object sender, EventArgs e)
    {
        editorService.CloseDropDown();
    }

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