Открытие окна или диалогового окна (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)»:

Назовем его TaskWindow .
Теперь определим на главном окне MainWindow кнопку для открытия нового окна:
Обработчик нажатия кнопки Button_Click будет выглядеть так:
private void Button_Click(object sender, RoutedEventArgs e)
Для открытия нового окна создаем его объект и затем вызываем метод Show() .

При нажатии на кнопку открывается окно 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 = "Новый заголовок!"; >
Открыть другое окно внутри текущего окна (WPF)
И так из названия думаю понятно, мне нужно открыть окно внутри окна, есть MainWindow , и SecondWindow , мне нужно открыть SecondWindow в MainWindow . Т.е внутри него, как это сделать? Я как только не пытался, и .ShowDialog() , и устанавливал owner — оно все равно открывает как новое окно, т.е не внутри MainWindow . Помогите пожалуйста, уже пол дня гуглю. Я пробовал такой дикий костыль, который работает, но криво, да он перекрывает форму так как надо, делая иллюзию что действительно окно в окне, но если я вынесу основное окно приложения за край и открою свое псевдо-модальное окно то оно станет на координаты 0 по той плоскости в которой основное окно вышло в минус. Т.е координаты окна основного -25, 300, т.е оно ушло на 25 влево за край экрана, а псевдо-модальное окно будет на 0, 300. Вот код которым я делал костыли из флешек:
var secondWindow = new SecondWindow(); var x = Left; var y = Top; secondWindow.MaxHeight = Height; secondWindow.MaxWidth = Width; secondWindow.Owner = this; secondWindow.ShowDialog(); secondWindow.Left = x; secondWindow.Top = y;
Отслеживать
задан 29 июн 2018 в 16:56
Pavel Erokhin Pavel Erokhin
76 1 1 серебряный знак 10 10 бронзовых знаков
А какой смысл в этом? Можно скрин того, что вы хотите? Ибо окно в окне не очень хорошее решение, а если вы хотите показать другой контент, то там это явно не окнами делается. Если же вам надо сделать всплывающее окно, то сделайте PopUp или что то на подобие, некий контрол поверх остального.
29 июн 2018 в 17:03
@EvgeniyZ Конечно, держите ссылки на скриншоты. Как было и как стало. ссылка / Отвечаю на смысл — так удобнее и как то по нормальному, чем окно на полный экран, ну на скринах видно, что действительно модальное лучше чем на полный экран, да и оно затемняет полный экран, а так только программу. Некий контрол? Не знаю, думаю сначала подумать над тем что бы сделать это в окне. 🙂
Как открыть окно WPF через WinForms?
Добрый день!
Уважаемые знатоки просьба подсказать как открыть окно WPF через WinForms
т.е. при нажатии кнопки в окне WinForms открылась бы окно WPF (в WinForms делал переводом модальной формы в Dll и последующим ее вызовом, а как смешать WinForms и WPF не имею представления). Формы будут создаваться в разных проектах в рамках одного решения.
Данная операция обусловлена постепенным переводом ПО на новую технологию.
p.s. Работу с WPF только начинаю, просьба сильно не пинать.
- Вопрос задан более трёх лет назад
- 1143 просмотра
1 комментарий
Оценить 1 комментарий