如何将自定义关闭按钮与 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;
}
}
我正在构建具有多个表单的 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;
}
}