Сложный шаблон мастера

#c# #winforms #wizard

#c# #winforms #мастер

Вопрос:

Я пытаюсь разработать sceleton для своего программного обеспечения с несколькими мастерами и не могу найти для этого хорошего решения. Все мои попытки слишком сложны и уродливы. Я использую NET CF и WinForms.

У меня есть несколько представлений: ViewA, ViewB, ViewC, ViewD и т.д., В каждом представлении есть кнопки «назад», «далее» и «отмена»

Эти представления используются мастерами, как показано ниже, у каждого мастера есть точка входа и конечная точка, также ее можно отменить.

 WzrdA: -> ViewA <-> ViewB <-> ViewC ->
WzrdB: -> ViewB <-> ViewD -> 
WzrdC: -> ViewC <-> ViewD -> 
  

И, наконец, мастера объединены в рабочие процессы:

 WfA: ViewMain (start WfA) -> WzrdA -> WzrdB -> WzrdC -> back to ViewMain
WfB: ViewMain (start WfB) -> WzrdA -> WzrdC -> back to ViewMain
  

Итак, у меня есть единственное главное представление с двумя кнопками «Запустить WfA» и «Запустить WfB», в этом случае рабочий процесс «WfB», например, должен показывать последующие представления:

  -> ViewA <-> ViewB <-> ViewC ->   ViewC <-> ViewD -> 
  

эта последовательность описывает кнопки «Назад» / «Далее», если была нажата кнопка «Отмена», ее необходимо немедленно переместить в основной вид.

Кто-нибудь знает четкое и приятное решение этой проблемы?

Комментарии:

1. Какую коллекцию вы используете для хранения «страниц» мастера?

2. Я запутался в связи между представлениями, мастерами и рабочими процессами. Означает ли это, что если я запускаю WfA, я вижу (разворачивая мастера -> представления): ViewA, ViewB, ViewC, VIEWBB, ViewD, ViewC, ViewD ? Это одна и та же форма / шаблон, просто используемые для отображения разных данных, или я действительно вижу одно и то же снова и снова?

Ответ №1:

Следующая концепция (из вашего поста) нарушает DRY, SRP и ООП в целом:

в каждом представлении есть кнопки «назад», «далее» и «отмена»

Для фреймворка wizard у вас обычно должно быть единственное родительское представление, в котором размещены эти кнопки. Должен быть контроллер, который управляет коллекцией страниц (LinkedList<> кажется естественным) и загружает страницы в родительский файл в соответствии с вашей логикой потока.

Общая архитектура, которую я здесь описываю, соответствует MVC. Проверьте это.

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