Чтобы продемонстрировать использование некоторых из этих новых атрибутов, закройте проект CarControlTestForm и снова откройте проект CarControlLibrary. Давайте создадим пользовательскую категорию (назвав ее "Конфигурация машины"), в которой будут отображаться все свойства и события CarControl. Также укажем "дружественное" описание для каждого члена и значение по умолчанию для каждого свойства. Для этого просто обновите каждое из свойств и событий типа CarControl так, чтобы они поддерживали атрибуты [Category], [DefaultValue] и [Description], как показано ниже.
public partial class CarControl: UserControl {
…
[Category ("Конфигурация машины"), Description ("Генерируется при приближении к пределу скорости. ")]
public event CarEventHandler AboutToBlow;
...
[Category ("Конфигурация машины"), Description("Имя вашей машины"), DefaultValue("Lemon")]
public string PetName {…}
…
}
Теперь позвольте прокомментировать то, что означает присваивание свойству значения по умолчанию, поскольку, я уверен, это не то, что вы можете (естественно) предполагать. Упрощенно говоря, атрибут [DefaultValue] не гарантирует, что соответствующее значение элемента данных, представленного данным свойством будет автоматически установлено равным значению по умолчанию. Так, хотя вы и указали значение по умолчанию "Lemon" для свойства PetName, член-переменная carPetName не получит значения "Lemon", пока вы не установите это значение с помощью конструктора типа или синтаксиса инициализации члена (что вы уже на самом деле сделали).
private string carPetName = "Lemon";
Атрибут [DefaultValue] "вступает в игру" тогда, когда программист "переустанавливает" значение данного свойства в окне свойств. Чтобы переустановить свойство в Visual Studio 2005, выберите интересующее вас свойство, щелкните на нем правой кнопкой мыши и в появившемся контекстном меню выберите Reset. Обратите внимание на то, что значение [Description] при этом появляется в нижней панели окна свойств (рис. 21.31).
Рис. 21.31. Переустановка свойства
Атрибут [Category] будет проявляться только тогда, когда программист выбирает для просмотра в окне свойств вид, сгруппированный по категориям (в противоположность просмотру по алфавиту, предлагаемому по умолчанию), рис. 21.32.
Рис. 21.32. Пользовательская категория
Определение выбираемых по умолчанию свойств и событий
Вдобавок к описаниям членов и группировке членов в категории вы можете настроить свои элементы управления на поддержку поведения, принятого по умолчанию. Так, для элемента управления можно назначить свойство, выбираемое по умолчанию. Для указания такого свойства используется атрибут [DefaultProperty], как показано ниже.
// Пометка свойства, выбираемого по умолчанию
// для данного элемента управления.
[DefaultProperty("Animate")]
public partial class CarControl: UserControl {…}
Тем самым вы гарантируете, что при выборе пользователем этого элемента управления в режиме проектирования в окне свойств автоматически будет выделено свойство Animate. Точно так же для элемента управления указывается выбираемое по умолчанию событие.
// Пометка события, выбираемого по умолчанию
// для данного элемента управления.
[DefaultEvent("AboutToBlow"), DefaultProperty("Animate")]
public partial class CarControl: UserControl
Тем самым вы гарантируете, что при двойном щелчке пользователя на этом элементе управления в режиме проектирования будет автоматически создан программный код заглушки для выбираемого по умолчанию события (теперь вам должно быть ясно, почему при двойном щелчке на Button автоматически обрабатывается событие Click, при двойном щелчке на Form – событие Load и т.д.).
Выбор изображений для панели инструментов
Наконец, непременным атрибутом любого "приличного" пользовательского элемента управления должно быть изображение, представляющее этот элемент управления в окне панели инструментов. В настоящий момент при выборе пользователем CarControl среда разработки покажет этот тип в панели инструментов со стандартной пиктограммой "зубчатки". Чтобы указать пользовательское изображение, первым шагом должно быть добавление в проект нового файла *.bmp (CarControl.bmp), размеры которого должны быть 16×16 пикселей (устанавливаются с помощью свойств Width и Height). Мы просто используем изображение Car из примера TreeView.
Читать дальше