|
|
|||||||||||||||||||||||||||||
|
Библиотека для создания мастера (wizard) под .NET Framework 2.0 (исходники)Источник: PmWiki
Постановка задачиБиблиотека предназначена для создания мастера (wizard) таким образом, чтобы последовательность прохождения его страниц могла бы быть нелинейной в зависимости от действий пользователя. Есть возможность откатываться на предыдущие страницы. При этом библиотека не определяет (или не навязывает) как должны выглядеть страницы, по умолчанию страница представляет собой пустое окно с тремя кнопками: "Вперед", "Назад" и "Отмена". РеализацияБиблиотека состоит из двух классов - WizardPage для создания страниц мастера и WizardManager для управления страницами. Давайте рассмотрим их поближе. ParamsTСначала рассмотрим параметр обобщений (generics) для всех классов. В качестве ParamsT может выступать любой класс, который содержит в себе все параметры, которые надо собрать на страницах мастера. Как он будет реализован зависит от программиста, я обычно делаю его обычным классом, который содержит набор public-полей, значения которых постепенно устанавливаются на каждой странице перед переходом на следующую страницу. Единственное требование от ParamsT, он должен иметь конструктор по умолчанию, т.к. экземпляр этого класса создается автоматически при создании мастера. WizardPageЭто обобщенный класс, производный от UserControl. В качестве параметра обобщения он принимает тип ParamsT, который был описан выше. Хотя этот класс и содержит public-конструктор, но использовать его не следует, потому что этот конструктор оставлен для использования дизайнером. А вместо этого следует пользоваться следующим конструктором:
Здесь первый параметр - экземпляр класса WizardManager, который будет описан ниже, а второй параметр - страница, которая будет считаться предыдущей по отношению к создаваемой. Если предыдущей страницы нет (например, когда это первая страница), то в качестве второго параметра надо передавать null. Кстати о первых страницах. На них желательно установить свойство кнопки next.Enabled в false. Также надо отметить следующий виртуальный метод:
Этот метод вызывается перед показом страницы. Его можно использовать, например, чтобы в окне установить значения каких-то величин, которые зависят от значений, введенных пользователем на предыдущих страницах. Через свойство Wizard можно получить доступ к классу мастера. Таким образом доступ к заполняемым параметрам внутри страниц осуществляется с помощью вызова this.Wizard.Params. Теперь о навигации между страницами. На кнопки "Отмена" и "Назад" уже повешены обработчики по умолчанию, которые вызывают виртуальные методы Cancel() и Back() соответственно. По умолчанию метод Cancel() присваивает свойству WizardManager.DialogResult значение DialogResult.Cancel и закрывает окно мастера:
Метод Back() указывает мастеру перейти на предыдущую страницу. А вот обработчик для кнопки next необходимо указать самостоятельно. Во-первых, в этом обработчике должен находиться код для заполнения тех параметров, которые пользователь вводит на текущей странице. А, во-вторых, внутри этого обработчика надо создать следующую страницу и указать мастеру перейти на нее. Как это делается написано в описании класса WizardManager чуть ниже. Если текущая страница является последней, то разумно поменять текст этой кнопки на слово "Финиш", а в обработчике нажатия на кнопку необходимо присвоить свойству WizardManager.DialogResult значение DialogResult.OK и закрыть мастер. Например, обтаботчик события может выглядеть так:
WizardManagerОбобщенный класс WizardManager<ParamsT> является производным от класса Form, а страницы мастера являются просто контролами, которые по очереди показываются и растягиваются на все окно. Внутри класса WizardManager хранятся заполняемые параметры, доступ к которым можно получить через свойство Params. Переход на новую страницу осуществляется через вызов метода SetPage(), который принимает в качестве параметра страницу, которую необходимо установить в качестве текущей. Как происходит установка новой страницы видно из исходника:
Для создания используется конструктор без параметров, а запуск мастера осуществляется через метод Start(), в качестве аргумента которому передается указатель на первую страницу мастера. О результате работы мастера (завершился ли он или был прерван) можно узнать по возвращаемому значению DialogResult метода Start(). Шпаргалка по использованию библиотекиСведем все действия, которые необходимо проделать для использования этой библиотеки в небольшую шпаргалку. 1. Создать класс с параметрами, которые заполняются по мере прохождения мастера пользователем. Этот класс должен иметь конструктор без параметров. Назовем его WizParams.
3. Создать класс экземпляра WizardManager. Пример использованияВ архиве находится также пример использования. Он содержит пятистраничный мастер. Первая страница является приветствующей, на ней не задаются параметры. На следующей странице пользователь вводит два числе a и b и выбирает действие со следующим числом c (вычитание) или d (умножение). Каким будет следующее окно зависит от выбора пользователя. Но каждая страница считает свое выражение (a + b - c или a + b * d) и сохраняет результат в параметры.
После чего показывает заключительную страницу с результатом. Файлы для загрузки
|
|