2009-10-20 3 views
6

Странный вопрос, но это немного меня озадачивает. В старые времена, когда у нас были терминалы и DOS, приложения обычно имели только одно «окно», и это было полноэкранное. Когда люди переключали функции, не было понятия открытия нового окна, но вместо этого содержимое главного окна было перезаписано. Таким образом, было только одно главное окно, но несколько экранов, которые были отображены в нем.Реализация нескольких экранов в приложении

Как создать что-то подобное в современном приложении, будь то WinForms или WPF?

Там, кажется, два подхода:

  • несколько окон. Это обычный подход, и обычно имеет смысл разрешить пользователю работать с несколькими окнами одновременно, но это может не потребоваться/не требуется. Использование ShowDialog() вместо Show() - это обычный способ сделать второй Window Modal.
  • Имейте только одно окно, но с TabControl на нем. Скройте вкладки и программно переключите их. Это близко к поведению «Одно окно, несколько экранов», но, естественно, оно становится беспорядочным, так как все элементы управления в одном классе формы (хотя можно утверждать, что это заставляет правильно называть элементы управления. Также можно рекомендовать использовать частичные классы и один .cs на экран)

Интересно, есть ли лучший способ? По сути, это то, что говорит: «Послушай, меня не волнуют такие вещи, как стили границы/значки или полоса главного меню. Все, что я хочу, это то, что вы отображаете этот экран в этой области». Kinda, как ASP.net Master Pages, где фактические страницы определяют только контент, который отображается в Placeholders.

Есть ли какой-то механизм, чтобы сделать что-то подобное?

Или есть что-то не так со всем подходом?

ответ

7

Один из подходов - реализовать каждый экран в качестве пользовательского элемента управления и динамически загружать и выгружать эти элементы управления в главном окне по мере необходимости. Я использовал этот подход в мобильном приложении Windows, и он неплохо справился.

+1

+1; Я просто написал вариант ответа. Теперь мне не нужно! –

+0

Это отличная идея, особенно потому, что пользовательские элементы управления могут быть помещены в другие контейнеры 8, например, панель), что делает управление безболезненным. –

1

Я не слышал об определенной структуре, чтобы выполнить это, но я бы сделал каждую страницу UserControl или, возможно, подклассом элемента управления с требуемой логикой визуализации. Эти элементы управления страницы будут членами этой формы и при необходимости добавлены в ее коллекцию Controls (или если их слишком много, создается по мере необходимости). У них бы были такие свойства, как Dock = DockStyle.Fill. При смене страниц:

void ChangePage(object sender, EventArgs e) 
{ 
    Controls.Clear(); 
    Controls.Add(sender as Control); 
}
3

Учитывая вы упомянули WPF, то стоит отметить, что Prism (композитный каркас пользовательского интерфейса из MPP) будет осуществлять, что с помощью нескольких представлений (UserControls) либо в пределах одного контроллера (для одной и той же генеральной совокупности) или нескольких контроллеров (через несколько агрегатов).

Либо представление, либо его ведущий могут инициировать команду (или транслировать событие через IEventAggregator), и ваш контроллер навигации может ответить, изменив текущее представление, присвоенное соответствующему «региону» (у вас может быть только один). Фактически, модель региона Призма очень похожа на модель MasterPage/Placeholder, поэтому вам может понадобиться изучить ее.

Призма может также включать отслеживание навигации (назад/вперед), но я не использовал ее, если это так.

1

Я работаю разработчиком C#, и я могу сказать вам, что шаг за шагом я начинаю использовать UserControl для нескольких экранов (страниц) приложений. Я создаю базовый класс для страницы с именем BasePage, который расширяет UserControl, и я расширяю его для каждой страницы, которая мне нужна (MainPage, SettingsPage и т. Д.). В MainForm (единственная форма приложения) я добавил элемент управления BasePage (например, CurrentPage), где я могу загрузить нужную страницу. из MainForm я отправляю необходимые события в CurrentPage. Я думаю, что это лучшее решение для такого приложения, где вам нужно несколько форм в одной форме. Это структура, которую я использую для всех приложений с несколькими страницами.

Если вы используете управление вкладками, вы в конечном итоге удушаете свою форму всеми элементами управления со всех загруженных одновременно вкладок. Я видел проекты с 10 + вкладками, очень сложными приложениями, которые очень медленны и сложны для кодирования.

Надеюсь, вы найдете этот ответ полезным!

Смежные вопросы