Как я могу закрыть дочернее окно, когда его родительское окно закрыто?(WPF) - PullRequest
0 голосов
/ 09 октября 2018

У меня есть дочернее окно, которое создается и отображается через Show().Пользователь может закрыть главное окно приложения, но мое дочернее окно все еще отображается.Как я могу справиться с этой ситуацией?Я предпочел бы обрабатывать все это из конструктора дочернего окна, так как это окно может быть создано из нескольких мест.Другими словами, я не хочу добавлять в обработчик событий «Закрытие» главного окна код, специально предназначенный для закрытия этого дочернего окна, например:

_mainWindow.Closed += (_, __) => _childWindow.Close();

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

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

Вместо того, чтобы обрабатывать это из дочернего окна и повторять этот код для каждого нового дочернего окна, которое вы можете создать, почему бы не отслеживать, когда главное окно закрывается из класса Application (в App.xaml.cs),а затем также закрыть все дочерние окна?Таким образом, дочернее окно не должно сохранять никаких ссылок на родительское окно, и вы можете сделать все это из центрального класса приложения.

Что-то вроде

private void Application_Startup(object sender, StartupEventArgs e)
{
    MainWindow mainWindow = new MainWindow();
    mainWindow.Closing += MainWindow_Closing;
}

private void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
    // close all child windows.
}
0 голосов
/ 09 октября 2018

Вы можете подключить обработчик событий к событию Closed главного окна приложения в конструкторе дочернего окна:

public partial class ChildWindow : Window
{
    public ChildWindow()
    {
        InitializeComponent();
        Window mainWindow = Application.Current.MainWindow;
        if (mainWindow != null)
            mainWindow.Closed += (s, e) => Close();
    }
}

Или вы можете установить ShutdownMode вашего приложения на OnMainWindowClose в вашем App.xaml.cs классе, как предложено @ChristianMurschall:

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        ShutdownMode = ShutdownMode.OnMainWindowClose;
    }
}
0 голосов
/ 09 октября 2018

Вы можете использовать свойство Windows.Owner.

_childWindow.Owner = _mainWindow;

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

https://docs.microsoft.com/en-us/dotnet/api/system.windows.window.owner?view=netframework-4.7.2

Если вам не нужны эти дополнительные действия, вы можете сделать то, что уже сделали, но поместить их в конструктор childWindows так, как хотите.

public childWindow(Window parentWindow)
{
    parentWindow.Closed += (s, e) => this.Close();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...