
WPF предоставляет несколько способов организации навигации между окнами, что важно при создании сложных приложений с несколькими интерфейсами. Основные методы включают открытие нового окна через Window.Show(), модальное отображение с помощью Window.ShowDialog() и управление окнами через NavigationService в приложениях на основе страниц.
Выбор подхода зависит от задач: Show() подходит для независимых окон, ShowDialog() блокирует взаимодействие с основным окном, пока пользователь не закроет диалог, а NavigationService удобен для пошаговой навигации между страницами, сохраняя состояние.
Практическая реализация требует контроля ресурсов и правильного закрытия окон, чтобы избежать утечек памяти. Например, при использовании Show() рекомендуется подписываться на событие Closed и освобождать объекты, связанные с окном.
В этой статье представлены пошаговые инструкции с примерами кода, позволяющие безопасно и эффективно переключаться между окнами в WPF, учитывая различные сценарии использования и особенности взаимодействия пользовательского интерфейса.
Создание нового окна в проекте WPF
В Visual Studio для добавления нового окна в проект WPF необходимо щелкнуть правой кнопкой мыши по папке проекта в Solution Explorer и выбрать Add → Window (WPF). В появившемся окне задайте имя файла, например SecondWindow.xaml, и нажмите Add.
После создания окна Visual Studio автоматически сгенерирует два файла: SecondWindow.xaml и SecondWindow.xaml.cs. Первый содержит разметку интерфейса, второй – кодовую часть для взаимодействия с элементами и обработчиками событий.
Для изменения размеров окна используйте атрибуты Width и Height в XAML. Пример: Width=»400″ Height=»300″. Заголовок окна задается через атрибут Title, например Title=»Новое окно».
В кодовой части можно добавить обработчики событий, например для кнопок или закрытия окна. Для этого создайте метод в файле SecondWindow.xaml.cs и свяжите его с событием через атрибут Click в XAML.
Для перехода на новое окно из основного окна создайте экземпляр класса окна и вызовите метод Show() или ShowDialog(). Show() открывает окно в нережимном режиме, позволяя работать с основным окном, ShowDialog() блокирует родительское окно до закрытия нового.
Добавление кнопки для вызова другого окна

Для перехода между окнами в WPF необходимо создать кнопку, которая будет инициировать открытие нового окна. Процесс включает несколько шагов, выполняемых в XAML и C#.
1. Добавление кнопки в XAML:
<Button Content="Открыть окно" Width="120" Height="30" Click="OpenWindow_Click"/>
Атрибут Click указывает на метод-обработчик события в коде C#.
2. Создание обработчика события в C#:
private void OpenWindow_Click(object sender, RoutedEventArgs e)
{
var newWindow = new SecondaryWindow(); // создаем экземпляр второго окна
newWindow.Show(); // открываем окно
}
Метод Show() отображает окно без блокировки текущего. Для модального окна используйте ShowDialog().
3. Убедитесь, что второе окно создано:
- В проекте добавьте новое окно:
Project → Add → Window (WPF). - Назовите его, например,
SecondaryWindow.xaml. - Определите его содержимое и размеры.
4. Дополнительные рекомендации:
- Если кнопка должна передавать данные в новое окно, создайте конструктор с параметрами в
SecondaryWindow. - Для закрытия исходного окна используйте
this.Close()после вызова нового окна. - Следите за управлением памятью: незакрытые окна остаются в памяти, что может привести к утечкам.
После выполнения этих шагов нажатие кнопки будет инициировать открытие нового окна, обеспечивая удобный переход между интерфейсными компонентами.
Открытие окна без закрытия текущего
В WPF для открытия нового окна, сохраняя текущее активным, используется метод Show() класса Window. В отличие от ShowDialog(), который блокирует взаимодействие с родительским окном, Show() позволяет работать с несколькими окнами одновременно.
Создайте экземпляр нового окна и вызовите у него метод Show():
var newWindow = new SecondWindow();
newWindow.Show();
Если требуется передать данные из текущего окна в новое, используйте конструктор с параметрами или свойства окна:
var newWindow = new SecondWindow(currentUser);
newWindow.Show();
Для контроля закрытия окон и предотвращения утечек памяти добавьте обработчики событий Closed у дочерних окон, если необходимо освобождать ресурсы или обновлять данные в родительском окне:
newWindow.Closed += (s, e) => { /* действия после закрытия */ };
Такой подход обеспечивает параллельное открытие нескольких окон, сохраняя взаимодействие с исходным интерфейсом и упрощая организацию многозадачного пользовательского интерфейса.
Открытие окна с закрытием текущего
В WPF для перехода между окнами с закрытием текущего используется метод Show() для нового окна и Close() для текущего. Такой подход позволяет освобождать ресурсы и предотвращает накопление открытых окон.
Пример реализации в обработчике события кнопки:
private void Button_Click(object sender, RoutedEventArgs e)
{
var новоеОкно = new Window2(); // создаем экземпляр нового окна
новоеОкно.Show(); // открываем новое окно
this.Close(); // закрываем текущее окно
}
Если приложение имеет главное окно MainWindow, которое задается в App.xaml, закрытие этого окна завершает работу приложения. Чтобы открыть новое окно и при этом не завершать приложение, используйте установку нового окна как Application.Current.MainWindow:
private void Button_Click(object sender, RoutedEventArgs e)
{
var новоеОкно = new Window2();
новоеОкно.Show();
Application.Current.MainWindow = новоеОкно;
this.Close();
}
Важно учитывать порядок вызова методов: Show() нового окна вызывается до Close() текущего. Иначе интерфейс может временно зависнуть или приложение завершится преждевременно.
Для передачи данных между окнами используйте конструкторы или свойства нового окна:
| Метод передачи | Пример |
|---|---|
| Через конструктор | var окно = new Window2(данные); |
| Через свойство | var окно = new Window2(); окно.Данные = данные; |
Этот метод подходит для большинства сценариев навигации, когда требуется закрыть текущее окно и продолжить работу с новым, сохраняя корректное управление ресурсами.
Передача данных между окнами
В WPF передача данных между окнами осуществляется через конструкторы, свойства или события. Наиболее прямой способ – передать значения через конструктор нового окна. Например, создавая окно WindowB, можно передать строку или объект: var windowB = new WindowB(data); windowB.Show();. В WindowB этот параметр сохраняется в локальном поле и используется для инициализации элементов.
Альтернативный вариант – использование публичных свойств. Открыв окно, можно задать свойства напрямую: var windowB = new WindowB(); windowB.UserName = "Alex"; windowB.Show();. Это удобно для передачи нескольких значений без изменения конструктора.
Для обратной передачи данных из дочернего окна в родительское применяют события или делегаты. В WindowB объявляют событие, например public event Action<string> DataSent;, и вызывают его при закрытии или сохранении данных. В родительском окне подписываются на событие: windowB.DataSent += UpdateData;, где UpdateData – метод для обработки полученной информации.
Если требуется передавать данные между несколькими окнами без прямой связи, используют паттерн MVVM с общим ViewModel или сервисами обмена данными. Это снижает зависимость между окнами и упрощает поддержку кода при расширении проекта.
При работе с объектами данных важно учитывать копирование и ссылки, чтобы изменения в одном окне не нарушали логику другого. Для сложных структур лучше использовать копирование через методы Clone или сериализацию.
Закрытие окна программно по событию
В WPF закрытие окна через код выполняется с помощью метода Close() объекта окна. Метод можно вызвать в обработчике события, например, нажатия кнопки или выбора элемента меню.
Пример: если на форме есть кнопка btnClose, добавьте обработчик события Click:
private void btnClose_Click(object sender, RoutedEventArgs e) { this.Close(); }
Для закрытия окна после завершения определённой операции можно подписаться на событие, например, изменения данных или окончания загрузки. В обработчике вызывается Close(), что завершает отображение окна и освобождает ресурсы.
Если требуется закрыть окно и при этом передать результат вызывающему окну, используйте свойство DialogResult перед вызовом Close():
this.DialogResult = true; this.Close();
В сложных сценариях, когда закрытие инициируется внешним компонентом, окно можно закрыть через ссылку на него: myWindow.Close();. Это позволяет управлять окнами из других частей приложения без прямого взаимодействия с интерфейсом пользователя.
Использование диалоговых окон для подтверждений
В WPF для получения подтверждения от пользователя применяется класс MessageBox. Его основной метод Show позволяет вывести окно с текстом, заголовком и кнопками. Например, для запроса подтверждения закрытия окна можно использовать:
var result = MessageBox.Show("Вы уверены, что хотите закрыть окно?", "Подтверждение", MessageBoxButton.YesNo, MessageBoxImage.Question);
Метод возвращает значение типа MessageBoxResult, которое позволяет определить действие пользователя. Например, закрытие окна при выборе Yes:
if (result == MessageBoxResult.Yes) { this.Close(); }
Для диалогов с вводом данных создаются собственные окна Window с нужными элементами управления. Их открывают методом ShowDialog(), который блокирует взаимодействие с родительским окном до закрытия диалога. Результат возвращается через свойство DialogResult:
var dialog = new CustomDialog();
if (dialog.ShowDialog() == true) { var input = dialog.UserInput; }
При проектировании диалоговых окон важно четко указывать кнопки действия, например, «ОК» и «Отмена», и корректно обрабатывать их состояния, чтобы предотвратить нежелательные действия без подтверждения.
Вопрос-ответ:
Как в WPF открыть новое окно и закрыть текущее автоматически?
Для открытия нового окна и закрытия текущего создайте экземпляр нужного окна, вызовите метод Show() для нового окна и метод Close() для текущего. Пример: var newWindow = new SecondWindow(); newWindow.Show(); this.Close();. Это позволяет пользователю продолжить работу с новым интерфейсом без лишних открытых окон.
Можно ли передавать данные между окнами в WPF?
Да, данные можно передавать через конструктор окна, свойства или методы. Например, создавая окно с параметром: var newWindow = new SecondWindow(userName);, где userName – строка. В окне SecondWindow этот параметр сохраняется в поле и используется для отображения информации или логики.
Как создать диалоговое окно для подтверждения действий?
В WPF для подтверждений используют стандартный класс MessageBox. Пример: if (MessageBox.Show("Удалить элемент?", "Подтверждение", MessageBoxButton.YesNo) == MessageBoxResult.Yes) { /* удаление */ }. Это создаёт модальное окно, блокирующее работу с основным интерфейсом до выбора пользователя.
Что делать, если нужно открыть несколько окон одновременно?
Можно создавать несколько экземпляров окон и вызывать у них метод Show(). Например: var win1 = new Window1(); win1.Show(); var win2 = new Window2(); win2.Show();. Все окна будут независимыми, пользователь сможет работать с каждым из них отдельно. Если требуется синхронизация данных между окнами, используют общие объекты или события для передачи изменений.
