Как включить поддержку дизайна в пользовательском элементе управления? - PullRequest
22 голосов
/ 07 мая 2010

Я постараюсь объяснить, что я после. Я не знаю, технический термин для этого, поэтому здесь идет:

Пример 1: Если я помещу ListView в форму и добавлю несколько столбцов, я смогу во время разработки щелкнуть и перетащить столбцы, чтобы изменить их размер.

Пример 2: Теперь я помещаю ListView в UserControl и называю его «MyCustomListView» (и, возможно, добавляю какой-то метод для его улучшения).

Если я знаю, поместите «MyCustomListView» в форму, я не смогу щелкнуть и перетащить заголовки столбцов, чтобы изменить их размер во время разработки.

Есть ли способ легко это осуществить? Некоторая форма "передает событие click-and-drag в базовый элемент управления и позволяет этому элементу делать свое волшебство" . Я не собираюсь перекодировать, просто передайте щелчок мышью (или что-то еще) и дайте, в этом случае, ListView среагировать, как это было в первом примере выше.

1 Ответ

51 голосов
/ 19 мая 2010

Дизайнер Windows Forms имеет выделенные классы конструктора для большинства элементов управления. Конструктор для ListView - это System.Windows.Forms.Design.ListViewDesigner, внутренний класс в сборке System.Design.dll. Этот класс дает вам возможность перетаскивать заголовки столбцов.

UserControl использует класс конструктора System.Windows.Forms.Design.ControlDesigner. Он не делает ничего особенного, просто помещает прямоугольник вокруг элемента управления с помощью перетаскивания. Вы можете видеть, к чему это ведет: после того, как вы поместили свой пользовательский элемент управления в форму, для разработки класса используется ControlDesigner, а ListViewDesigner отсутствует на рисунке. Таким образом, вы теряете возможность перетаскивать заголовки столбцов. Также обратите внимание, что ControlDesigner не предоставляет доступ к элементам управления внутри UC.

Однако это можно исправить, создав собственного дизайнера. Начните с Projects + Add Reference, выберите System.Design. Вам потребуется добавить открытое свойство в UC, чтобы открыть представление списка, и применить атрибут [DesignerSerializationVisibility], чтобы разрешить сохранение измененных свойств. И примените атрибут [Designer] к классу UC, чтобы заменить конструктор по умолчанию. Все это должно напоминать это (с использованием имен по умолчанию и ListView, который отображает «сотрудники»):

using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;
using System.Windows.Forms.Design;   // Note: add reference required: System.Design.dll

namespace WindowsFormsApplication1 {
    [Designer(typeof(MyDesigner))]   // Note: custom designer
    public partial class UserControl1 : UserControl {
        public UserControl1() {
            InitializeComponent();
        }

        // Note: property added
        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public ListView Employees { get { return listView1; } }
    }

    // Note: custom designer class added
    class MyDesigner : ControlDesigner {
        public override void Initialize(IComponent comp) {
            base.Initialize(comp);
            var uc = (UserControl1)comp;
            EnableDesignMode(uc.Employees, "Employees");
        }
    }
}

Теперь можно просмотреть список в пользовательском элементе управления и создать его как обычно.

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