Как в wpf перейти на другое окно
Перейти к содержимому

Как в wpf перейти на другое окно

  • автор:

Открытие окна или диалогового окна (WPF .NET)

Вы можете создать собственные окна и отобразить их в Windows Presentation Foundation (WPF). В этой статье вы узнаете, как отображать модальные и безрежимные окна и диалоговые окна.

Концептуально окно и диалоговое окно совпадают: они отображаются пользователю для предоставления информации или взаимодействия. Они оба объекта «окно». Дизайн окна и способ его использования — это то, что делает диалоговое окно. Диалоговое окно обычно небольшое по размеру и требует от пользователя ответить на него. Дополнительные сведения см. в обзоре окон WPF и диалоговых окон.

Если вы хотите открыть диалоговые окна операционной системы, см . статью «Как открыть общее диалоговое окно».

Открыть как модальный

При открытии модального окна обычно это диалоговое окно. WPF ограничивает взаимодействие модальным окном, а код, открывший окно, приостанавливается до закрытия окна. Этот механизм позволяет легко запрашивать пользователя с данными и ждать ответа.

ShowDialog Используйте метод для открытия окна. Следующий код создает экземпляр окна и открывает его модально. Код, открывающий окно, приостанавливается, ожидая закрытия окна:

var window = new Margins(); window.Owner = this; window.ShowDialog(); 
Dim myWindow As New Margins() myWindow.Owner = Me myWindow.ShowDialog() 

После закрытия окна один и тот же экземпляр объекта не может использоваться для повторного открытия окна.

Дополнительные сведения о том, как обрабатывать ответ пользователя на диалоговое окно, см . в обзоре диалоговых окон: обработка ответа.

Открытие в режиме без режима

Открытие окна без режима означает отображение его как обычное окно. Код, открывающий окно, продолжает выполняться по мере того, как окно становится видимым. Вы можете сосредоточиться и взаимодействовать со всеми бессерверными окнами, отображаемыми приложением без ограничений.

Show Используйте метод для открытия окна. Следующий код создает экземпляр окна и открывает его без режима. Код, открывающий окно, продолжает выполняться:

var window = new Margins(); window.Owner = this; window.Show(); 
Dim myWindow As New Margins() myWindow.Owner = Me myWindow.Show() 

После закрытия окна один и тот же экземпляр объекта не может использоваться для повторного открытия окна.

См. также

  • Общие сведения об окнах WPF
  • Общие сведения о диалоговых окнах
  • Закрытие окна или диалогового окна
  • Открытие общего диалогового окна
  • Открытие окна сообщения
  • System.Windows.Window
  • System.Windows.Window.DialogResult
  • System.Windows.Window.Show()
  • System.Windows.Window.ShowDialog()

Совместная работа с нами на GitHub

Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

Как в wpf перейти на другое окно

Рассмотрим, как мы можем взаимодействовать с несколькими окнами в WPF. Для этого создадим новый проект. По умолчанию он уже содержит одно главное окно MainWindow. Теперь добавим еще одно окно. Для этого в окне добавления нового элемента нам надо выбрать тип «Window (WPF)»:

Добавление окна в WPF

Назовем его TaskWindow .

Теперь определим на главном окне MainWindow кнопку для открытия нового окна:

Обработчик нажатия кнопки Button_Click будет выглядеть так:

private void Button_Click(object sender, RoutedEventArgs e)

Для открытия нового окна создаем его объект и затем вызываем метод Show() .

Взаимодействие между окнами в WPF

При нажатии на кнопку открывается окно TaskWindow.

Используя ссылку на окно, мы можем взаимодействовать с ним, например, передавать ему данные из главной формы или вызывать его методы. Например, изменим код C# класса TaskWindow:

using System.Windows; namespace WindowApp < public partial class TaskWindow : Window < public string ViewModel < get; set; >public TaskWindow() < InitializeComponent(); >public void ShowViewModel() < MessageBox.Show(ViewModel); >> >

Здесь добавлено свойство ViewModel и метод, который отображает его содержимое. Теперь изменим обработчик Button_Click в главном окне MainWindow:

private void Button_Click(object sender, RoutedEventArgs e)

Здесь у окна TaskWindow устанавливается свойство ViewModel и вызывается его метод.

Важно отметить, что после открытия эти окна существуют независимо друг от друга. Мы можем закрыть главное окно MainWindow, и второе окно TaskWindow все равно продолжит свою работу. Однако мы можем задать и другое поведение.

У всех окон есть свойство Owner , которое указывает на главное окно, владеющее текущим окном. Так, изменим обработчик Button_Click в главном окне:

private void Button_Click(object sender, RoutedEventArgs e) < TaskWindow taskWindow = new TaskWindow(); //Теперь MainWindow главное окно для taskWindow taskWindow.Owner = this; taskWindow.Show(); >

Теперь текущий объект MainWindow является владельцем taskWindow. Если, к примеру, мы закроем MainWindow, то закроется и TaskWindow.

Кроме того, мы можем обращаться из TaskWindow к своему владельцу:

public partial class TaskWindow : Window < public void ChageOwnerBackground() < this.Owner.Background = new SolidColorBrush(Colors.Red); >// остальной код >

С другой стороны все зависимые окна доступны в главном окне-владельце через свойство OwnedWindows :

private void Button_Click(object sender, RoutedEventArgs e) < TaskWindow taskWindow = new TaskWindow(); taskWindow.Owner = this; taskWindow.Show(); foreach(Window window in this.OwnedWindows) < window.Background = new SolidColorBrush(Colors.Red); if (window is TaskWindow) window.Title = "Новый заголовок!"; >>

Класс App и свойство Windows

Еще одним способ для взаимодействия с окнами предоставляет класс App — главный класс приложения. Он содержит свойство Windows , которое хранит информацию обо всех открытых окнах приложения. И в любом месте программы мы можем получить эту информацию:

foreach(Window window in App.Current.Windows) < window.Background = new SolidColorBrush(Colors.Red); // если окно - объект TaskWindow if (window is TaskWindow) window.Title = "Новый заголовок!"; >

#7 — Переход между окнами в приложении

#7 - Переход между окнами в приложении

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

Видеоурок

Для перехода между страницами необходимо выполнять две задачи:

  1. скрывать окно в котором сейчас находитесь;
  2. открывать новое окно приложения.

Ниже приведен код для реализации подобного функицонала:

this.Hide(); // Скрываем нынешнее окно // Создаем объект на основе определенного окан MainForm mainForm = new MainForm(); // Показываем новое окно mainForm.Show();
Программа обучения

Если вас интересует более углубленное изучение самого языка и его фреймворков, то предлагаем вашему внимаю наш полный курс по изучению C# . За курс вы изучите язык C#, научитесь делать веб проекты на основе ASP NET и строить приложения при помощи WinForms и WPF.

Взаимодействие окон

Класс Application предоставляет два инструмента для получения доступа к другим окнам: свойство MainWindow и свойство Window. При желании отслеживать окна более специализированным образом — например, путем отслеживания экземпляров определенного класса Window, которые могут представлять документы — разработчик может добавлять в класс Application собственные статические свойства.

Разумеется, получение ссылки на другое окно — это только полдела. Также необходимо определиться со способом взаимодействия. В принципе необходимость во взаимодействии окон следует сводить к минимуму, поскольку это излишне усложняет код. Однако если действительно требуется, чтобы значение элемента управления в одном окне изменялось на основе действия, выполняемого пользователем в другом окне, тогда, конечно, лучше создать в целевом окне специальный метод. Это гарантирует правильную идентификацию зависимости и добавит еще один уровень косвенности, упрощающий подгонку изменений в интерфейсе окна.

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

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

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

Взаимодействие с одним окном

Взаимодействие одного окна со многими

При взаимодействии между окнами очень часто полезным оказывается метод Window.Activate(). Этот метод позволяет передавать команду активизации нужному окну. Можно также использовать свойство Window.IsActive для проверки того, является ли данное окно в текущий момент единственным активным окном.

В этом примере привязку можно ослабить. Вместо того, чтобы вызывать метод в разных окнах, класс Application может просто возбуждать событие и позволить окнам самостоятельно выбирать, как на него реагировать.

Поддержка команд WPF может помочь абстрагировать логику приложения. Команды представляют собой специфические для приложений задачи и могут инициироваться любым способом.

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

Владение окнами

В .NET окно может «владеть» другими окнами. Окна, имеющие окно-владельца, удобно применять для плавающих окон панелей инструментов и окон команд. Одним из примеров такого окна является окно Find and Replace (Найти и заменить) в Microsoft Word. Когда окно-владелец сворачивается, окно, которым оно владеет, тоже автоматически сворачивается. Когда имеющее владельца окно перекрывает окно, которое им владеет, оно всегда отображается сверху.

Для поддержки владения окна класс Window предлагает два свойства: Owner и OwnedWindows. Свойство Owner представляет собой ссылку, которая указывает на окно, владеющее текущим окном (если таковое имеется), а свойство OwnedWindows — коллекцию всех окон, которыми владеет текущее окно (опять-таки, если они есть). Настройка владения окна подразумевает просто установку свойства Owner, как показано ниже:

//Создание нового окна. ToolWindow winTool = new ToolWindow(); // Назначение текущего окна владельцем. winTool.Owner = this; // Отображение окна, принадлежащего окну-владельцу. winTool.Show ();

Окна, обладающие окном-владельцем, всегда отображаются как немодальные. Чтобы удалить такое окно, нужно всего лишь установить для его свойства Owner значение null.

WPF не включает системы для построения многодокументных приложений (Multiple Document Interface — MDI). Если необходимо более сложное управление окнами, придется разработать его самостоятельно (или приобрести нужный компонент у независимых разработчиков).

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *