检测用户何时在工具栏(右上角)按下红色X。

3
在我编写的 C# 测试/学习应用程序中,我使用隐藏/显示属性来打开和关闭窗口。这是一个 WPF 应用程序。
在主窗口中,我有一个“关闭”按钮,触发此方法:
public void buttonQuit_Click(object sender, RoutedEventArgs e)
{
    var message = exitmessage;
    var title = exitTitle;
    var result = MessageBox.Show(
        message,                    // the message to show
        title,                      // the title for the dialog box
        MessageBoxButton.YesNo,     // show two buttons: Yes and No
        MessageBoxImage.Question);  // show a question mark icon

    // lets see what has been pressed
    switch (result)
    {

        case System.Windows.MessageBoxResult.Yes:   // Yes button pressed
            CloseAllWindows();
            break;

        case System.Windows.MessageBoxResult.No:    // No button pressed
            break;

        default:                 // Neither Yes nor No pressed (just in case)
            MessageBox.Show("Oh noes! What did you press?!?!");
            break;
    }
}

我通过这种方式确保所有的窗口都被关闭,包括隐藏的窗口。但现在有一个问题;当用户按下(在主窗口中)工具栏中的右上角红色X来关闭窗口时,只有主窗口会关闭,但背景中的隐藏窗口仍然存在。
因此,实际上有两个问题:
1. CloseAllWindows(); 是否真的足以完全关闭应用程序? 2. 我如何“捕捉”用户按下工具栏中的红色X事件,并使其触发正确的关闭事件?
2个回答

2
你应该处理窗口的 ClosingClosed 事件。前者允许你取消关闭,而后者只允许你对窗口关闭做必要的清理工作。
因此,在这种情况下,你应该将你的 buttonQuit_Click 方法中的代码放到附加到 Closing 事件的处理方法中,以便无论如何关闭窗口都会触发它。
然后,你的 buttonQuit_Click 方法只需调用窗口的 Close method 方法。这将关闭窗口,进而引发 Closing 事件,并运行附加的处理方法中的代码。
关于你的另一个问题,CloseAllWindows会做它所说的事情:它将关闭你的应用程序打开的所有窗口。在大多数情况下,这应该足以关闭应用程序,但如果你创建了非后台线程或依赖于ShutdownMode设置,它可能不够用。

App.Current.Shutdown将无条件地工作。


我还不是很精通 C#(才两周哈哈),所以您说的将方法放入处理程序是什么意思呢? - Dante1986
通过处理程序,他指的是事件处理程序。Closing或Closed是事件委托,您需要添加一个方法委托来处理该事件。我认为现在是您查看MSDN上有关事件的文档的最佳时机http://msdn.microsoft.com/en-us/library/awbftdfh.aspx - Shekhar_Pro
@Dante:阅读有关事件处理的内容。您可以通过将处理程序方法(它与常规方法类似,但具有特殊的签名)附加到该事件来处理事件。每当事件被触发时,都会调用您的处理程序方法。 - Cody Gray

1

啊哈,现在开始有点明白了。谢谢你提供的链接。 - Dante1986

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接