如何将自定义关闭按钮与 Window_Closing 分开?

How to separate custom Close Button from Window_Closing?

我正在构建具有多个表单的 WPF 应用程序,我的目标是,在 LoginForm 上,我有一个名为 Login 的按钮,单击该按钮会关闭当前表单(上面的 LoginForm)并打开另一个表单(假设是 Form1)。

请注意,我试图一次只打开一个表单。

代码-

private void btnLogin_Click(object sender, RoutedEventArgs e)
    {
        if(everything okay)
        {
            Form1 frm = new Form1();
            frm.Show();
            Close();
        }
        else
        {
            return;
        }
    }

这很好用。但是,我的第二个想法是,如果点击右上角的X,我想关闭这个表单,而不是打开任何其他的,基本上退出应用程序。

代码-

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
        MessageBoxResult rez = MessageBox.Show("Do you wish to leave the app?", "Question?", MessageBoxButton.YesNo, MessageBoxImage.Question);

        if (rez != MessageBoxResult.Yes)
        {
            e.Cancel = true;
        }
    }

这是我的问题开始的地方,我发现 Window_Closing 和 this.Close() 是同一个事件,所以,当我单击登录按钮时,MessageBoxResult 仍然显示,即使那不是我的目标。 如果可能的话,我想以某种方式将这两个事件分开。我该怎么做?

this.Close 不是事件。 this.Close() 是一种方法,之后事件 Window_Closing 被引发

尝试这样的事情:

Form1 frm = new Form1();
Hide();
frm.ShowDialog();
Close();

您创建一个表单,然后隐藏登录表单,然后显示表单的对话框。关闭新的 Form1() 后将引发关闭。

您可以在调用 Close():

之前暂时取消事件处理程序
private void btnLogin_Click(object sender, RoutedEventArgs e)
{
    if (everything okay)
    {
        Form1 frm = new Form1();
        frm.Show();
        Closing -= Window_Closing;
        Close();
        Closing += Window_Closing;
    }
    else
    {
        return;
    }
}

或者用一个bool变量来决定是否显示MessageBox:

private bool _showMessageBox = true;

private void btnLogin_Click(object sender, RoutedEventArgs e)
{
    if (everything okay)
    {
        Form1 frm = new Form1();
        frm.Show();
        _showMessageBox = false;
        Close();
        _showMessageBox = true;
    }
    else
    {
        return;
    }
}

private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
    if (!_showMessageBox)
        return;

    MessageBoxResult rez = MessageBox.Show("Do you wish to leave the app?", "Question?", MessageBoxButton.YesNo, MessageBoxImage.Question);

    if (rez != MessageBoxResult.Yes)
    {
        e.Cancel = true;
    }
}