Подтвердить что ты не робот

Как включить поддержку дизайна в пользовательском элементе управления?

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

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

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

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

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

4b9b3361

Ответ 1

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

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

Это можно исправить, создав собственный дизайнер. Начните с проектов + Добавить ссылку, выберите System.Design. Вам нужно будет добавить публичное свойство в UC, чтобы открыть представление списка и применить атрибут [DesignerSerializationVisibility], чтобы разрешить сохранение измененных свойств. И примените атрибут [Дизайнер] к классу 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");
        }
    }
}

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