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

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

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

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

Если я знаю, помещают "MyCustomListView" в Форму, я не могу перетащить заголовки столбцов для изменения размеров их во Время проектирования.

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

23
задан Hans Passant 22 September 2013 в 17:41
поделиться

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], чтобы разрешить сохранение измененных свойств. И примените атрибут [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");
        }
    }
}

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

52
ответ дан 29 November 2019 в 01:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: