Как выйти полностью из приложения?
изучаю WPF, не могу разобраться с событиями. Сделал событие OnClosing на основном окне и когда пользователь хочет закрыть я его спрашиваю дополнительно об этом и всё работает на главном окне. Но тут парадокс, как мне полностью закрывать приложение, если при переходе на другие окна я скрываю основное окно и при попытке закрыть приложение со 2 окна, он постоянно попадает в событие OnClosing. Не понимаю как можно это реализовать. Он как бы когда я пытаюсь окна закрыть попадает в события onClosing и из-за этого срабатывает повторная проверка.
public void MainWindow_OnClosing(object sender, CancelEventArgs e)
{
var exit = MessageBox.Show(
"Вы действительно хотите закрыть приложение?",
"Выход из приложения", MessageBoxButton.YesNo);
if (exit == MessageBoxResult.Yes)
Application.Current.Shutdown();
else
e.Cancel = true;
}
public void ShowWindow_OnClosing(object sender, CancelEventArgs e)
{
MainWindow mainWindow = new MainWindow();
mainWindow.MainWindow_OnClosing(sender, e);
}
т.е при закрытии не с главного окна - выводится два MessageBox

Ответы (1 шт):
MainWindow mainWindow = new MainWindow();
Не надо этого делать. Вы просто таким образом создаете новое окно, копию MainWindow, а не взаимодействуете со старым. Основы ООП - не надо путать типы и объекты, познакомьтесь с понятиями "экземпляр класса" и "объект". Класс - это некий шаблон для создания объекта, но не сам объект.
Чтобы обратиться к главному окну, вам нужно передать на него ссылку в дочернее окно при его создании.
public partial class ShowWindow
{
private readonly MainWindow _mainWindow;
public ShowWindow(MainWindow mainWindow)
{
InitializeComponent();
_mainWindow = mainWindow;
}
}
При создании дочернего окна в главном окне, передайте ему ссылку на главное окно.
ShowWindow child = new ShowWindow(this);
child.Show();
Далее, не надо вызывать обработчик Closing явно, вызывайте просто закрытие окна
public void ShowWindow_OnClosing(object sender, CancelEventArgs e)
{
_mainWindow.Close();
}
Здесь возникает вопрос, а как же закрыть текущее окно только тогда, когда главное окно приняло решение закрыться, а вот так:
public partial class ShowWindow
{
private readonly MainWindow _mainWindow;
private bool _mainClosed;
public ShowWindow(MainWindow mainWindow)
{
InitializeComponent();
_mainWindow = mainWindow;
// событие Closed вызывается если Closing не было отменено
_mainWindow.Closed += (s, e) => { _mainClosed = true; this.Close(); }
}
public void ShowWindow_OnClosing(object sender, CancelEventArgs e)
{
if (_mainClosed)
return;
_mainWindow.Close();
e.Cancel = true;
}
}
Далее, не используйте Application.Current.Shutdown(); - это плохой код и говорит он о том, что вы не можете в полной мере контролировать свои окна.
Поправьте обработчик вот так.
public void MainWindow_OnClosing(object sender, CancelEventArgs e)
{
var exit = MessageBox.Show(
"Вы действительно хотите закрыть приложение?",
"Выход из приложения", MessageBoxButton.YesNo);
if (exit != MessageBoxResult.Yes)
e.Cancel = true;
}
А вообще познакомьтесь с диалогами, то есть узнайте отличие .ShowDialog() от .Show(). Возможно и не придется городить такие костыли с обработчиками, чтобы начать нормально контролировать окна.
Подробнее о том, когда и какие события возникают у окна, можно узнать здесь: Window lifetime events.