|
Создание унаследованных .NET компонентов в C# • Скелет
Visual Studio .NET предлагает массу различных компонентов, которые перекрывают львиную долю задач, но всегда хочется чего-то особенного. Более функционального, более простого в использовании, более красивого компонента. Создание новых компонентов в Visual Studio - очень простое дело, хоть и сопряженное подчас с некоторыми неудобствами и нелогичными решениями. Тем не менее, мы сейчас увидим, как за три простых шага можно создать полноценный пользовательский компонент. Итак, начинаем.
Для начала надо придумать, что именно мы собираемся реализовать. Я очень долго думал, и не придумал ничего лучше кнопки для диалоговых окон, которая сама меняет надпись на себе в завимости от свойства DialogResult. Ценность такого компонента, конечно, более чем сомнительна, но для примера сойдет... Теперь, когда мы поставили себе стратегическую задачу, и уже знаем, что мы хотим делать, самое время обратиться к тактике и узнать, как мы достигнем наших высоких целей.
Прежде всего надо создать решение, solution, этакий метапроект, содержащий в себе несколько других проектов. В меню Visual Studio выбираем
File | New | Project... В появившемся окне выбираем Windows Control Library, вводим имя (я ввел in3steps), указываем путь для сохранения файлов и жмем ОК. Открывается редактор, в котором мы видим файлы, любезно созданные для нас средой. Смотрим на Solution Explorer, находим UserControl1.cs и переименовываем его во что-то более понятное. Я выбрал красивое имя DialogButton.
Теперь открываем это файл и смотрим, что у него внутри. Внутри у него много чего ненужного. В частности, по умолчанию Visual Studio создает пользовательские компоненты с ключевым словом partial, то есть реализованные в двух отдельных файлах. Это сделано, наверное, для сложных компонентов, где среда дает возможность вставлять компоненты в компоненты при помощи визуального редактора форм. У нас обычная кнопка, которая никогда не будет содержать никаких других компонентов, так что эти кудри нам ни к чему. Удаляем DialogButton.Designer.cs из проекта, удаляем слово partial из объявления класса, заменяем в базовом типе UserControl на Button, убираем вызов InitializeComponent() из конструктора. Скелет нашего компонента готов:
namespace in3steps
{
public class DialogButton : Button
{
public DialogButton()
{
}
}
}
|
Конечно, сейчас это просто копия стандартной кнопки, но все равно хочется посмотреть на нее и убедиться в том, что мы все сделали правильно. Жмем F5, среда задумывается и выдает ошибку, говоря о том, что в нашем решении отсутствуют пользовательские компоненты. Жаль. Так хотелось бы, чтобы для компонентов, унаследованных от Button и прочих из стандартного набора, запускался бы автоматический и удобный TestContainer, который запускается для потомков UserControl. Не судьба. Придется делать тестовое приложение самим.
В меню Visual Studio жмем File | New | Рroject... В открывшемся окне выбирам WindowsApplication, вводим какое-нибудь осмысленное имя, например, Test, в элементе Solution выбираем Add to Solution, чтобы новый проект добавился в наше текущее решение и жмем ОК. Теперь находим наш новый проект Test в окне Solution Explorer, щелкаем правой кнопкой и выбираем в меню Set as StartUp Project, чтобы именно этот проект запускался по умолчанию. Экономим силы и больше ничего не переименовывам, так как этот проект нам нужен только для тестирования нашей кнопки.
Теперь находим в окне Solution Explorer файл Form1.cs, щелкаем на нем два раза, чтобы открыть редактор форм, ищем закладку in3step Components и ставим на форму наш новый компонент DialogButton. После чего жмем F5 и наконец-то любуемся нашей кнопкой, которая пока, впрочем, отличается от стандартной только именем класса. Как сделать так, чтобы она отличалась еще чем-то, мы узнаем в следующем шаге.
|