Как закрыть окно wpf
Перейти к содержимому

Как закрыть окно wpf

  • автор:

Как закрыть окно в WPF после нажатия кнопки в этом окне?

Вы устанавливаете контент новой страницы, а не делаете навигацию.

this.NavigationService.GoBack(); 

Тут происходит навигация в никуда, так как никакой навигации не было, было только переназначение контента.

Отслеживать
28.7k 4 4 золотых знака 40 40 серебряных знаков 79 79 бронзовых знаков
ответ дан 16 сен 2017 в 22:20
886 1 1 золотой знак 9 9 серебряных знаков 15 15 бронзовых знаков

public void Button_Click(object sender, RoutedEventArgs e) < var page = new Page1(); page.Owner = this; // this.Content = page; /* Если раскомментировать, то выбросит исключение: Необработанное исключение типа "System.InvalidOperationException" Дополнительные сведения: Объект Window должен быть корнем дерева. Нельзя добавить объект Window как дочерний объект для Visual.*/ page.Show(); >

В дочернем окне:

private void Button_Click(object sender, RoutedEventArgs e)

Но имейте ввиду, что закроются оба окна.

Отслеживать
28.7k 4 4 золотых знака 40 40 серебряных знаков 79 79 бронзовых знаков
ответ дан 17 сен 2017 в 20:58
460 3 3 серебряных знака 15 15 бронзовых знаков

  • c#
  • wpf
    Важное на Мете
Похожие

Подписаться на ленту

Лента вопроса

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

Дизайн сайта / логотип © 2023 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2023.10.27.43697

Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.

Как закрыть окно wpf

Добрый день!
Есть окно. В нем DataGrid. SelectedItem забинден на свойство во ViewModel.
Есть две кнопки Применть и Отмена. Применить — закрывает окно, а Отменить закрывает окно и обнуляет выбранный пользователем элемент в DataGrid.
Соответственно хочу сделать биндинг кнопок к командам но не знаю как закрывать окно в ViewModel.Можно конечно команды перенести во View но не хотелось бы.
Как быть?
Спасибо!

Re: [WPF] WVVP закрытие окна

От: Lexxpin
Дата: 09.06.10 07:13
Оценка:

А>Добрый день!
А>Есть окно. В нем DataGrid. SelectedItem забинден на свойство во ViewModel.
А>Есть две кнопки Применть и Отмена. Применить — закрывает окно, а Отменить закрывает окно и обнуляет выбранный пользователем элемент в DataGrid.
А>Соответственно хочу сделать биндинг кнопок к командам но не знаю как закрывать окно в ViewModel.Можно конечно команды перенести во View но не хотелось бы.
А>Как быть?
А>Спасибо!
Не помню как в WPF, в Silverlight окно закрывается, когда присваиваешь DialogResult окну.
Следовательно, в ViewModel должно быть свойство «окно закрыто» и сделать биндинг между этим свойством и DialogResult.
Если такой способ не прокатит, всегда можно сделать AttachedProperty и биндить свойство на него.

Re: [WPF] WVVP закрытие окна

От: MxMsk
Дата: 09.06.10 07:27
Оценка:

Здравствуйте, Аноним, Вы писали:

А>Добрый день!
Добрый

А>Есть окно. В нем DataGrid. SelectedItem забинден на свойство во ViewModel.
А>Есть две кнопки Применть и Отмена. Применить — закрывает окно, а Отменить закрывает окно и обнуляет выбранный пользователем элемент в DataGrid.
А>Соответственно хочу сделать биндинг кнопок к командам но не знаю как закрывать окно в ViewModel.Можно конечно команды перенести во View но не хотелось бы.
А>Как быть?
Разные есть варианты. Можно сделать специальный сервис, который модель будет вызвать для закрытия окна, а этот сервис уже будет иметь конкретную реализацию, заточенную на класс Window. Другой вариант, добавить в модель не только команду, но и событие. Это событие модель будет вызывать, когда решит, что окно надо закрыть. Твое окно подпишется на это событие и позовет себе Close. Таким образом, решение о закрытии мы возлагаем на модель.

Как закрыть окно из другого окна?

Здравствуете, подскажите пожалуйста как можно закрыть окно из другого окна.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
private void NewProject_Click(object sender, RoutedEventArgs e) { DefaultWindow dw = new DefaultWindow(); NewProjectPage npp = new NewProjectPage(); dw.Icon = BitmapFrame.Create(Application.GetResourceStream (new Uri(@"Images\edit.png", UriKind.RelativeOrAbsolute)).Stream); dw.MinHeight = npp.MinHeight; dw.MinWidth = npp.MinWidth; dw.Content = npp.Content; dw.Title = npp.Title; dw.ShowDialog(); }

Что я должен написать в коде, чтобы при открытии окна dw закрывался текущее окно(прошу заметить, код находится не в окне (Window), а в странице (Page))?

P.S. Извиняюсь за русский.

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

[WPF] Закрыть окно из другого page
Всем привет, уже который час ломаю голову над такой проблемой: У меня есть главная страница, и есть.

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

Как закрыть окно opengl не закрывая консольного окна c++?
Как закрыть окно opengl не закрывая консольного окна c++?

Как одним кликом по ссылке внутри модального окна закрыть текущее окно и открыть новое?
Приветствую. Кто знает, подскажите как нажав на ссылку внутри модального окна закрыть текущее окно.

Эксперт .NET

15225 / 10343 / 2721
Регистрация: 21.04.2018
Сообщений: 30,656
Записей в блоге: 2

Цитата

Сообщение от Arthur Progy

Что я должен написать в коде, чтобы при открытии окна dw закрывался текущее окно

Также как в любом другом объекте C#.
Для того чтобы обратиться к методу другого объекта сначала нужно получить ссылку на этот другой объект.
Как передать ссылку на окно в странице зависит от того как эта страница создаётся и показывается.
Но в целом это «не есть хорошо» когда нижестоящие объекты (страницы) управляют вышестоящими (окнами).
Лучше в App какой-то интерфейс по управлению окнами и обращаться к нему.
Поищите в разделе темы с различными реализациями управления окнами в многоконом приложении.

Регистрация: 04.02.2021
Сообщений: 36

А как закрывать нижестоящие окна так же ?

Если с главного окна отрываю окно 2, с окно 2 открываю окно 3, с окна 3 открываю окно 4))))
Как с окна 2 , закрыть все окна 3 и 4?

Эксперт .NET

15225 / 10343 / 2721
Регистрация: 21.04.2018
Сообщений: 30,656
Записей в блоге: 2

ЦитатаСообщение от froovs Посмотреть сообщение

А как закрывать нижестоящие окна так же ?

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

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

1 2 3 4 5 6 7 8 9 10 11
private void OnCloseClick(object sender, RoutedEventArgs e) { var windows = Application.Current.Windows; for (int i = windows.Count - 1; i >= 0; i--) { windows[i].Close(); if (windows[i] == this) break; } }

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

Концептуально, должно быть какое-то поле в Окне хранящее ссылку на «дочернее» Окна или на их коллекцию.
В событии Closing Окна проверяется это поле и если в нем есть Окно (или Овна), то для них вызывается Close().
Так же должно быть реализовано и в дочерних.
В результате, вызывая метод Close для Окна вы получите автоматическое закрытие всех Окон по нижележащей иерархии.

87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
Помогаю со студенческими работами здесь

Закрыть дочернее окно при открытии копии этого окна
Подскажите пожалуйста, как закрыть дочернее окно Form2 если открылась копия этого окна? имея две.

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

Как закрыть окно формы и открыть окно другой
Код такой. Нужно по нажатии кнопки закрыть форму 1 и открыть форму 2. но, что-то так не работает.

Надо открыть окно браузера (не из другого окна, а по нажатию на ярлык).
Такая задача. Надо открыть окно браузера (не из другого окна, а по нажатию на ярлык). При этом окно.

Как закрыть первое окно (MainWindow)?

Как закрыть или скрыть основное окно и открыть дочернее, и как потом закрыть дочернее окно и открыть основное
Здравствуйте, передо мной возникла проблема, с которой я не могу справиться. Суть проблемы в том.

Как закрыть окно в MVVM
Открываю новое окно вот таким способом, а вот как закрыть не предстовляю так как команда закрытия.

Как закрыть окно MainWindow?
Здравствуйте У меня возникла следующая проблема: Не могу нормально удалить окно MainWindow. .

Как прижать окно MainWindow и окно второе к левому верхнему углу экрана?
Имеется MainWindow (которое по умолчанию) в приложении. Имеется созданное окно (второе).

Программист
415 / 415 / 7
Регистрация: 10.09.2010
Сообщений: 1,344
Очень просто

me.close()

Регистрация: 20.02.2011
Сообщений: 84
Сергей.NET, Не работает, можно поподробней?
Программист
415 / 415 / 7
Регистрация: 10.09.2010
Сообщений: 1,344
MichaelPozhinat, потому что это код для бейсик, на си шарпе будет так

this.Close();

Регистрация: 20.02.2011
Сообщений: 84

Сергей.NET, this.Close() тоже не закрывает, первая форма (MainWindow) главная, может можно её скрыть?

Программист
415 / 415 / 7
Регистрация: 10.09.2010
Сообщений: 1,344
а второе окно появляется из window1 или mainwindow?
181 / 107 / 13
Регистрация: 22.03.2010
Сообщений: 456

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

1 2 3 4 5 6 7 8 9 10
/// /// Главная точка входа для приложения. ///  [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); }

Программист
415 / 415 / 7
Регистрация: 10.09.2010
Сообщений: 1,344
Nukutu, почему- то у меня не закрывается

1 2 3 4 5 6 7
private void button1_Click(object sender, RoutedEventArgs e) { Window1 Window1 = new Window1(); Window1.Show(); this.Close(); }

181 / 107 / 13
Регистрация: 22.03.2010
Сообщений: 456

Сергей.NET, твой код у меня работает правильно.
На мгновение появляется вторая форма и закрываются обе.
Так что ты там что-то химичешь.

Программист
415 / 415 / 7
Регистрация: 10.09.2010
Сообщений: 1,344
Nukutu, то есть?О_о
Программист
415 / 415 / 7
Регистрация: 10.09.2010
Сообщений: 1,344
Nukutu,
закрыть окно.zip
181 / 107 / 13
Регистрация: 22.03.2010
Сообщений: 456

ЦитатаСообщение от Сергей.NET Посмотреть сообщение

то есть?О_о

Кнопка нажимается в главной форме, а поэтому this.Close(); закрывает главную форму, в которой создан єкземпляр Window1 Window1 = new Window1();
При закрытии главной формы вся память, используемая данной формой, в том числе под Window1 Window1, очищается, а поэтому Window1 будет закрыт, даже если нет Window1.Close(); и даже если программист этого не хочет.

Видать ты сделал три формы, главную, первую и вторую.
Но в посте четко написано первая есть главная. Значит вторая в первой (главной).

Программист
415 / 415 / 7
Регистрация: 10.09.2010
Сообщений: 1,344

ЦитатаСообщение от Nukutu Посмотреть сообщение

Видать ты сделал три формы
у меня там два окна, меин и окно1
181 / 107 / 13
Регистрация: 22.03.2010
Сообщений: 456

ЦитатаСообщение от Сергей.NET Посмотреть сообщение

Действительно не закрывается.
Я проверял код на Windows forms. Выходит есть разница, а не должно.

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

Регистрация: 16.07.2009
Сообщений: 44

Есть еще способ:

1 2 3 4 5 6 7 8 9 10
///Скрываем главную форму this.Visibility = System.Windows.Visibility.Collapsed; Window1 wind = new Window1(); wind.Closed += (sender2, e2) => { ///Отображаем форму после закрытия Window1 this.Visibility = System.Windows.Visibility.Visible; }; ///при отображении формы, материнская форма стает в режим ожидания ///как при отображении MessageBox wind.ShowDialog();

Эксперт .NET

4431 / 2091 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1

Лучший ответ

Сообщение было отмечено SatanaXIII как решение

Решение

ЦитатаСообщение от Nukutu Посмотреть сообщение

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

1 2 3 4 5 6 7 8 9 10 11
namespace Wpf_Demo { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); Application.Current.ShutdownMode = ShutdownMode.OnMainWindowClose; } } }

И будет вам как в WinForms.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
// Сводка: // Определяет способ завершения работы приложения.Используется в свойстве System.Windows.Application.ShutdownMode. public enum ShutdownMode { // Сводка: // Приложение завершает работу в одном из двух случаев: когда закрывается последнее // окно или когда вызывается метод System.Windows.Application.Shutdown(). OnLastWindowClose = 0, // // Сводка: // Приложение завершает работу в одном из двух случаев: когда закрывается главное // окно или когда вызывается метод System.Windows.Application.Shutdown(). OnMainWindowClose = 1, // // Сводка: // Приложение завершает работу только в случае вызова метода System.Windows.Application.Shutdown(). OnExplicitShutdown = 2, }

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

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