Это довольно сложная тема; Я построил довольно всеобъемлющий элемент управления Wizard около двух лет назад для домашнего использования, и я помню, что для того, чтобы работать правильно, понадобилось несколько недель.
Основные элементы:
- Панель заголовка
- Панель содержимого
- Панель действий
- Боковая панель
И панель содержимого, и панель действий используют ParentControlDesigner
для включения элементов управления отбрасыванием. Панель содержимого не позволяет перетаскивать ее непосредственно на нее, а позволяет перетаскивать ее на активную страницу (подпанель). Панель действий также имеет режим «по умолчанию», в котором создаются стандартные 4 кнопки (предыдущая, следующая, отмена, завершить). Я в основном реализовал пользовательский режим, чтобы можно было его оформить, то есть использовать кнопки DevEx вместо стандартных кнопок Winforms.
Заголовок в основном статический, это PictureBox
и Label
с настраиваемым изображением, текстом и шрифтом. (По умолчанию текст совпадает с заголовком страницы, а шрифт - это шрифт элемента управления с добавленным жирным шрифтом).
Тогда есть набор структур данных, предоставляемых API:
- Шаги (с именем, названием и т. Д., Также указывают, должны ли они быть связаны в боковой панели)
- Рабочие процессы (т. Е. Когда вы переходите к следующему на основе вашего выбора)
- События проверки (как синхронные, так и асинхронные)
- Действия (запускаются до / после смены страницы, нажатия кнопок и т. Д.)
- Эффекты перехода (я сделал это для удовольствия, пользователи любят их)
Я собрал пользовательский редактор коллекций для шагов, которые, в свою очередь, создали подпанели для панели контента, как описано выше. Каждая панель просто добавляется прямо в коллекцию элементов управления, но только одна из них видна одновременно на основе свойства активного шага. Я помню, что док-станция никогда не работала правильно, поэтому мне пришлось переопределить все методы изменения размера. Я никогда не удосужился создать смарт-тег для быстрого переключения между страницами, но активную страницу (или индекс страницы) можно выбрать в сетке свойств.
Затем мне также пришлось включить целую кучу хуков для вставки любой пользовательской логики на отдельные страницы. Трудно действительно разобраться во всех подробностях без публикации всего кода.
Требуется довольно много времени, чтобы должным образом спроектировать и протестировать, но я не помню, чтобы использовались какие-либо хитрости при проектировании Whizbang, просто пришлось методично подходить к проблеме, как уже упоминалось, с точки зрения отдельных элементов пользовательского интерфейса (как времени выполнения, так и дизайна время) и структуры данных и как они взаимодействуют.
Имейте в виду, что все это было сделано с целью создания повторно используемого компонента Wizard, поскольку нам нужно было разработать около 10 из них для конкретного приложения (и это пригодилось бы и для других проектов). Если бы мне просто нужно было собрать одного быстрого мастера, я бы не стал проходить через все эти проблемы, я бы просто делал то, что вы делаете - используйте элемент управления вкладками и несколько панелей управления. Или, что еще лучше, я бы использовал готовый элемент управления мастера, который теперь доступен во многих библиотеках Winforms, например, в библиотеке DX.