Общие сведения о редакторах типов пользовательского интерфейса
Пользовательскую функциональность сложных типов свойств можно создать путем реализации редакторов типов в пользовательском интерфейсе.
Отображение и редактирование пользовательских типов
При использовании пользовательского типа в качестве свойства значение свойства в сетке PropertyGrid можно изменить тремя способами:
Свойство можно редактировать на месте как строковое значение. В этом случае для пользовательского типа требуется преобразователь TypeConverter. Дополнительные сведения см. в разделе Практическое руководство. Реализация преобразователя типов.
Свойство можно редактировать с помощью раскрывающегося пользовательского интерфейса. Этот метод особенно эффективен для свойств, задаваемых одним щелчком кнопки мыши.
Свойство можно редактировать с помощью модального диалогового окна. Если свойство характеризуется повышенной сложностью, для его редактирования может потребоваться полноценное диалоговое окно.
Чтобы обеспечить возможность редактирования как с помощью модального диалогового окна, так и одним щелчком кнопки мыши, необходимо реализовать редактор типа в пользовательском интерфейсе, взаимодействующий с сеткой PropertyGrid.
Раскрывающиеся редакторы
Раскрывающиеся редакторы идеально подходят для типов, которые задаются одним щелчком кнопки мыши. Например, свойства Dock и BackColor класса Control редактируются в сетке PropertyGrid с помощью раскрывающегося редактора.
Раскрывающийся редактор типа в пользовательском интерфейсе вызывается нажатием кнопки со стрелкой (), которая находятся рядом со строкой выбранного свойства в сетке PropertyGrid. После этого отображается пользовательский интерфейс, присоединенный к PropertyGrid. Верхняя граница этого окна примыкает к нижней границе строки свойства, а его ширина совпадает с шириной строки свойства. Окно редактора должно быть закрыто после того, как пользователь сделает выбор. Для позиционирования и изменения размера окна редактора типа в пользовательском интерфейсе в среде разработки пользовательская реализация должна вызывать метод DropDownControl; для закрытия окна следует вызвать метод CloseDropDown.
Модальные диалоговые редакторы
Модальные редакторы полезны для типов, которым необходим полностью интерактивный пользовательский интерфейс. Например, модальными редакторами являются такие редакторы коллекций, как Редактор коллекции TabPage элемента управления TabControl или Правка столбцов диалогового окна элемента управления DataGridView.
Доступ к модальному редактору типа в пользовательском интерфейсе осуществляется нажатием кнопки с многоточием (), которая отображается рядом со строкой выбранного свойства в сетке PropertyGrid. После этого появится модальное диалоговое окно, с которым пользователь работает так же, как и с обычным диалоговым окном. Для позиционирования и изменения размера диалогового окна в среде разработки пользовательская реализация должна вызывать метод ShowDialog.
Реализация редактора типа в пользовательском интерфейсе
Для реализации пользовательского редактора типа в пользовательском интерфейсе, необходимо, как минимум, выполнить следующие действия:
Определите класс, производный от класса UITypeEditor.
Переопределить метод GetEditStyle, передавая сетке PropertyGrid тип стиля редактирования, используемый редактором.
Переопределить метод EditValue, обрабатывая функции пользовательского интерфейса и вводимые пользователем данные, а также выполняя присваивание значений.
Дополнительную поддержку отрисовки представления значения в сетке PropertyGrid можно добавить, выполнив следующие действия:
Переопределив метод GetPaintValueSupported, указывая, что редактор поддерживает отображение представления значения.
Переопределив метод PaintValue, реализуя отображение представления значения.
Переопределив метод-конструктор UITypeEditor, если редактор должен обладать поведением во время инициализации.
Примечание
Часто редакторы типов в пользовательском интерфейсе реализуются с помощью типов из пространства имен System.Windows.Forms, однако это не является обязательным требованием.Стандартные редакторы типов в пользовательском интерфейсе платформы .NET Framework являются производными от класса UITypeEditor.
Наследование от класса UITypeEditor
Пользовательский редактор типа в пользовательском интерфейсе должен наследовать от класса UITypeEditor. Определите конструктор по умолчанию, если редактор типов в пользовательском интерфейсе нуждается в особой инициализации.
Переопределение метода GetEditStyle
При выборе компонента или элемента управления в конструкторе окно Свойства обновляется, отображая значения свойств выбранного компонента или элемента управления. При выборе свойства среда разработки вызывает метод GetEditStyle, чтобы определить способ представления строки свойства.
Переопределенный метод возвращает значение перечисления UITypeEditorEditStyle для указания необходимого стиля редактора типа в пользовательском интерфейсе.
В следующей таблице описано поведение для всех значений перечисления UITypeEditorEditStyle.
Имя члена |
Поведение |
---|---|
Интерактивные компоненты пользовательского интерфейса не предоставляются. Для преобразования строкового значения в значение свойства используется соответствующий преобразователь TypeConverter. |
|
В строке свойства отображается кнопка со стрелкой, направленной вниз (). Пользовательский интерфейс размещается в раскрывающемся окне. |
|
В строке свойства отображается кнопка с многоточием (). В качестве пользовательского интерфейса используется модальное диалоговое окно. |
Переопределение метода EditValue
Метод EditValue отвечает за отображение пользовательского интерфейса и занесение значения, указанного пользователем, в свойство.
Раскрывающийся редактор
В случае раскрывающегося редактора типа в пользовательском интерфейсе у поставщика службы запрашивается интерфейс IWindowsFormsEditorService. Эта служба предоставляет сведения о позиционировании и размере для пользовательского интерфейса. Обычно пользовательский интерфейс реализуется в виде элемента управления Control. Пользовательская реализация EditValue создает экземпляр данного элемента управления, инициализирует текущим значением свойства, а затем передает его методу DropDownControl для выполнения средой разработки. Когда пользователь выберет новое значение свойства, реализация EditValue закрывает пользовательский интерфейс, вызывая метод CloseDropDown. Значение, возвращаемое пользовательской реализацией EditValue, будет использовано в качестве нового значения свойства, отображаемого в сетке PropertyGrid.
Модальный редактор.
В случае модального редактора типа в пользовательском интерфейсе у поставщика службы запрашивается интерфейс IWindowsFormsEditorService. Эта служба предоставляет сведения о позиционировании и размере для диалогового окна. Обычно пользовательский интерфейс реализуется в виде класса-наследника Form. Пользовательская реализация EditValue создает экземпляр данной формы, инициализирует его текущим значением свойства, а затем передает его методу ShowDialog для выполнения средой разработки. Если этот вызов возвращает значение OK, то новое значение свойства извлекается из формы и используется в качестве возвращаемого значения. Значение, возвращаемое пользовательской реализацией EditValue, будет использовано в качестве нового значения свойства, отображаемого в сетке PropertyGrid.
Параметр ITypeDescriptorContext
Метод EditValue принимает параметр ITypeDescriptorContext, который может применяться для запроса контекстной информации о среде разработки. Данный параметр позволяет обращаться к следующим членам:
дескриптор PropertyDescriptor, представляющий метаданные свойства;
свойство Instance, которое относится к компоненту, выбранному в сетке PropertyGrid;
интерфейс IContainer компонента;
методы OnComponentChanging и OnComponentChanged, уведомляющие среду разработки об изменении состояния компонента.
Реализация графического представления значения свойства
Переопределив метод PaintValue, можно отображать графическое представление значения свойства. Параметр PaintValueEventArgs можно использовать для того, чтобы отрисовывать представление в небольшом прямоугольнике, расположенном слева от строки свойства в сетке PropertyGrid.
Примечание
Необходимо следить за тем, чтобы графическое представление не выходило за границы, определенные свойством Bounds параметра PaintValueEventArgs.
Переопределите метод GetPaintValueSupported, возвращая истинное значение для уведомления среды разработки о том, что редактор типа в пользовательском интерфейсе применяет пользовательское представление значения.
См. также
Задачи
Практическое руководство. Создание редактора типов пользовательского интерфейса