📜  如何在其他窗口 wpf 中检测到 WindowCloseEvent - C# (1)

📅  最后修改于: 2023-12-03 14:52:54.094000             🧑  作者: Mango

如何在其他窗口 WPF 中检测到 WindowCloseEvent - C#

在 WPF 中,可以使用 Closing 事件来捕获关闭窗口的事件,但是该事件只在窗口本身上触发。如果想在其他窗口中监听关闭事件,可以使用以下方法:

  1. 创建自定义事件

可以在需要检测关闭事件的窗口中创建一个自定义事件,在窗口关闭时触发该事件。其他窗口可以订阅该事件并执行相应的操作。

public partial class MainWindow : Window
{
    public delegate void WindowCloseEventHandler(object sender, EventArgs e);
    public event WindowCloseEventHandler WindowCloseEvent;

    protected virtual void OnWindowClose()
    {
        if (WindowCloseEvent != null)
            WindowCloseEvent(this, EventArgs.Empty);
    }

    private void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
        OnWindowClose();
    }
}

在其他窗口中订阅事件:

private void SubscribeMainWindowCloseEvent()
{
    var mainWindow = Application.Current.Windows.OfType<MainWindow>().FirstOrDefault();
    if (mainWindow != null)
        mainWindow.WindowCloseEvent += MainWindow_WindowCloseEventHandler;
}

private void MainWindow_WindowCloseEventHandler(object sender, EventArgs e)
{
    // 执行相应的操作
}
  1. 使用消息机制

可以使用 MessengerEventAggregator 等消息机制来实现窗口间的通信。在需要检测关闭事件的窗口中发送消息,在其他窗口中订阅该消息并执行相应的操作。

使用 Messenger 示例:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        // 注册关闭事件
        Closing += MainWindow_Closing;
    }

    private void MainWindow_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
        // 发送关闭消息
        Messenger.Default.Send(new WindowCloseMessage());
    }
}

public class WindowCloseMessage
{
    // 消息类
}

public class OtherWindow : Window
{
    public OtherWindow()
    {
        InitializeComponent();

        // 订阅关闭消息
        Messenger.Default.Register<WindowCloseMessage>(this, (message) =>
        {
            // 执行相应的操作
        });
    }
}

以上是两种实现方法,根据实际需求选择适合的方式。