Форма Windows / WPF слишком большая, как я могу ее разделить? - PullRequest
5 голосов
/ 15 сентября 2010

Я собираюсь создать приложение WPF. Пока в uni единственный способ, которым мы когда-либо создавали GUI, - это иметь одно главное окно с одним файлом code-behind для обработки нажатий кнопок и т. Д.

Моя проблема в том, что с ростом приложения растет графический интерфейс пользователя, и размер кода, стоящего за файлом, может выйти из-под контроля!

Я определил около 15 основных вариантов использования моей системы (пример: введите детали, просмотрите детали и т. Д.). Я создаю главное окно (размер: 480x320), которое состоит из 15 отдельных экранов (по одному для каждого варианта использования). Этого можно достичь с помощью центрированного и растянутого TabControl с 15 TabItem's. Или, более вероятно, это может быть просто набор многослойных контейнеров, один поверх другого (только один видимый одновременно).

Дело в том, что с 15 отдельными экранами мой файл с выделенным кодом станет огромным (не говоря уже о файле xaml!): Жонглирование между состояниями - создание 14 свёрнутых / скрытых и создание одного видимого, обработка элементов управления для 15 различных экраны.

Есть ли способ иметь 15 отдельных форм, каждая со своим собственным файлом code-behind, вместо 15 TabItems в одной форме, а затем иметь один основной движок, создающий и удаляющий их по мере необходимости? Конечно, это должно выглядеть так, как будто это одна форма, а не 15 всплывающих окон.

Как мне справиться с этим? Как бы вы справились с проблемой файлов xaml и code-behind длиной в тысячи строк?

Ответы [ 6 ]

6 голосов
/ 15 сентября 2010

Если вы собираетесь начать использовать WPF, вам обязательно стоит взглянуть на шаблон проектирования MVVM и , командующий . Вам также следует подумать об использовании внедрения зависимостей через контейнер IOC, его довольно легко настроить, это отличный учебник .

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

5 голосов
/ 15 сентября 2010

Ваши инстинкты хороши: вы не хотите поместить все в одно окно.Было бы гораздо лучше поместить каждый из 15 «экранов» в свой собственный файл XAML в виде пользовательских элементов управления или страниц.

Если навигация в стиле веб-браузера будет иметь смысл для вашего приложения, тогда посмотритев классе Page .Если вы установите StartupUri вашего приложения, чтобы указывать на страницу (вместо окна), то вы автоматически получите окно с кнопками Назад и Вперед и можете использовать Гиперссылка s.(установите свойство NavigateUri для указания на другую страницу) или методы NavigationService для перехода на новые страницы.

Если вы не хотите, чтобы Назад и Впередкнопки, затем поместите каждый «экран» в свой собственный UserControl и добавьте минимальную логику в главное окно, чтобы показать и скрыть их.Или, если вы используете MVVM , вы можете настроить магию, в которой вы просто измените DataContext вашего окна (или, еще лучше, свойство в ViewModel уровня приложения), и оно автоматическизагружает и показывает правильный UserControl (посмотрите DataTemplate s или посмотрите видео ниже).

Я также настоятельно рекомендую использовать MVVM, чтобы попытаться написать как можно меньше кода (в идеале вообще ничего - не всегда достижимо, но вы многому научитесь, попробовав).Это делает ваш XAML тонн проще для рефакторинга.Если позже вы решите, что в одной из ваших гридов слишком много материала, вы можете просто вырезать и вставить его в новый UserControl, не тратя кучу времени на распутывание всего кода позади.

Поскольку это звучиткак будто вы не знакомы с шаблоном MVVM, это видео может показаться вам слишком сложным, но я не могу не рекомендовать выступление MIX2010 " Build Your Own MVVM Framework ".Это откровение о том, что может сделать MVVM, и у него есть четкие идеи о том, как управлять навигацией между различными пользовательскими элементами управления.(Он также имеет ссылку на вступительное слово к MVVM.)

1 голос
/ 15 сентября 2010

Вы должны создать каждый экран как UserControl и ссылаться на него в вашем MainWindow xaml.

Однако кажется, что у вас есть огромный недостаток дизайна в вашем приложении, то есть ваша логика в пользовательском интерфейсе. Файл с выделенным кодом не для управления вашим приложением или логикой, а для управления вашим пользовательским интерфейсом! Возможно, вы захотите взглянуть на шаблон MVC и Dependency Injection, чтобы решить эту проблему.

Платформа Wpf Application будет началом для этого.

0 голосов
/ 15 сентября 2010

В Руководстве по составным приложениям WPF (или Prism) используется концепция Состав пользовательского интерфейса для обработки разбиения пользовательского интерфейса на более мелкие классы.

0 голосов
/ 15 сентября 2010

Вы можете сделать свой класс partial и разбить его на отдельные файлы.

0 голосов
/ 15 сентября 2010

Что касается файлов с выделенным кодом, вы можете использовать теги #region, чтобы разрешить свертывание и развертывание различных экранов ... Хотя логическое разделение это лучший подход, если это возможно

...