Библиотека для создания мастера (wizard) под .NET Framework 2.0 (исходники)

Источник: PmWiki

Постановка задачи

Библиотека предназначена для создания мастера (wizard) таким образом, чтобы последовательность прохождения его страниц могла бы быть нелинейной в зависимости от действий пользователя. Есть возможность откатываться на предыдущие страницы. При этом библиотека не определяет (или не навязывает) как должны выглядеть страницы, по умолчанию страница представляет собой пустое окно с тремя кнопками: "Вперед", "Назад" и "Отмена".

Реализация

Библиотека состоит из двух классов - WizardPage для создания страниц мастера и WizardManager для управления страницами. Давайте рассмотрим их поближе.

ParamsT

Сначала рассмотрим параметр обобщений (generics) для всех классов. В качестве ParamsT может выступать любой класс, который содержит в себе все параметры, которые надо собрать на страницах мастера. Как он будет реализован зависит от программиста, я обычно делаю его обычным классом, который содержит набор public-полей, значения которых постепенно устанавливаются на каждой странице перед переходом на следующую страницу. Единственное требование от ParamsT, он должен иметь конструктор по умолчанию, т.к. экземпляр этого класса создается автоматически при создании мастера.

WizardPage

Это обобщенный класс, производный от UserControl. В качестве параметра обобщения он принимает тип ParamsT, который был описан выше. Хотя этот класс и содержит public-конструктор, но использовать его не следует, потому что этот конструктор оставлен для использования дизайнером. А вместо этого следует пользоваться следующим конструктором:

public WizardPage (WizardManager<ParamsT> wizard, WizardPage<ParamsT> prevPage)

Здесь первый параметр - экземпляр класса WizardManager, который будет описан ниже, а второй параметр - страница, которая будет считаться предыдущей по отношению к создаваемой. Если предыдущей страницы нет (например, когда это первая страница), то в качестве второго параметра надо передавать null. Кстати о первых страницах. На них желательно установить свойство кнопки next.Enabled в false.

Также надо отметить следующий виртуальный метод:

public virtual void Init ()

Этот метод вызывается перед показом страницы. Его можно использовать, например, чтобы в окне установить значения каких-то величин, которые зависят от значений, введенных пользователем на предыдущих страницах.

Через свойство Wizard можно получить доступ к классу мастера. Таким образом доступ к заполняемым параметрам внутри страниц осуществляется с помощью вызова this.Wizard.Params.

Теперь о навигации между страницами. На кнопки "Отмена" и "Назад" уже повешены обработчики по умолчанию, которые вызывают виртуальные методы Cancel() и Back() соответственно. По умолчанию метод Cancel() присваивает свойству WizardManager.DialogResult значение DialogResult.Cancel и закрывает окно мастера:

protected virtual void Cancel ()
{
        this.Wizard.DialogResult = DialogResult.Cancel;
        this.Wizard.Close ();
}

Метод Back() указывает мастеру перейти на предыдущую страницу.

А вот обработчик для кнопки next необходимо указать самостоятельно. Во-первых, в этом обработчике должен находиться код для заполнения тех параметров, которые пользователь вводит на текущей странице. А, во-вторых, внутри этого обработчика надо создать следующую страницу и указать мастеру перейти на нее. Как это делается написано в описании класса WizardManager чуть ниже. Если текущая страница является последней, то разумно поменять текст этой кнопки на слово "Финиш", а в обработчике нажатия на кнопку необходимо присвоить свойству WizardManager.DialogResult значение DialogResult.OK и закрыть мастер. Например, обтаботчик события может выглядеть так:

private void next_Click (object sender, EventArgs e)
{
        this.Wizard.DialogResult = System.Windows.Forms.DialogResult.OK;
        this.Wizard.Close ();
}

WizardManager

Обобщенный класс WizardManager<ParamsT> является производным от класса Form, а страницы мастера являются просто контролами, которые по очереди показываются и растягиваются на все окно.

Внутри класса WizardManager хранятся заполняемые параметры, доступ к которым можно получить через свойство Params.

Переход на новую страницу осуществляется через вызов метода SetPage(), который принимает в качестве параметра страницу, которую необходимо установить в качестве текущей. Как происходит установка новой страницы видно из исходника:

public void SetPage (WizardPage<ParamsT> page)
{
        if (_currentPage != null)
        {
                _currentPage.Hide ();
                Controls.Remove (_currentPage);
        }

        page.Dock = DockStyle.Fill;
        page.Parent = this;
        Controls.Add (page);

        _currentPage = page;
        _currentPage.Visible = true;
        _currentPage.Init ();
}

Для создания используется конструктор без параметров, а запуск мастера осуществляется через метод Start(), в качестве аргумента которому передается указатель на первую страницу мастера. О результате работы мастера (завершился ли он или был прерван) можно узнать по возвращаемому значению DialogResult метода Start().

Шпаргалка по использованию библиотеки

Сведем все действия, которые необходимо проделать для использования этой библиотеки в небольшую шпаргалку.

1. Создать класс с параметрами, которые заполняются по мере прохождения мастера пользователем. Этот класс должен иметь конструктор без параметров. Назовем его WizParams.
2. Создать страницы мастера, для этого:

  • Создать класс-прокси (пусть он называется WizardPageProxy), производный от WizardPage<WizParams>, который реализует два конструктора public WizardPageProxy (WizardManager<WizParams> wizard, WizardPageProxy prevPage) и WizardPageProxy (). Этот промежуточный класс необходим из-за того, что дизайнер Visual Studio не может работать с обобщенными классами.
  • Создать страницы мастера, производные от класса-прокси (WizardPageProxy ).
  • Реализовать те же два конструктора, что и у класса-прокси.
  • Переопределить виртуальный метод Init(), если это необходимо.
  • Создать обработчик события на нажатие кнопки next, в котором заполнить нужные данные в параметрах, создать следующую страницу и передать ее в качестве параметра метода SetPage класса WizardManager.
  • Если страница первая, то установить свойство Enabled в false для кнопки возврата назад.

3. Создать класс экземпляра WizardManager.
4. Вызвать мастера через метод Start.

Пример использования

В архиве находится также пример использования. Он содержит пятистраничный мастер. Первая страница является приветствующей, на ней не задаются параметры.

На следующей странице пользователь вводит два числе a и b и выбирает действие со следующим числом c (вычитание) или d (умножение).

Каким будет следующее окно зависит от выбора пользователя. Но каждая страница считает свое выражение (a + b - c или a + b * d) и сохраняет результат в параметры.

     

После чего показывает заключительную страницу с результатом.


Страница сайта http://test.interface.ru
Оригинал находится по адресу http://test.interface.ru/home.asp?artId=8318