如何在关闭应用程序之前显示未保存的更改对话框?

我有一个C#Windows窗体应用程序

在应用程序关闭之前,我想显示一个“未保存的更改。保存/退出/取消”样式确认对话框。可能同时防止应用程序关闭。我该怎么办?

如果应用程序无法关闭,Windows 10上的关机过程会发生什么?

zhaojiyong 回答:如何在关闭应用程序之前显示未保存的更改对话框?

取决于显示技术(WPF / UWP或WinForms),但是每个窗体通常都有一个“关闭”事件。您可以在其中显示MessageBox甚至取消表单关闭。

它们都在Form / Windows的基本类中:

https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.form.closing

https://docs.microsoft.com/en-us/dotnet/api/system.windows.window.closing

仅在所有表单关闭后(可能包括隐藏的表单),应用程序本身才会关闭,因此这将阻止应用程序关闭。但是,如果不抵抗,单独的表单可能仍会关闭。

如果您的应用程序无法关闭,并且用户未选择“强制关闭”,则Windows的“关机过程”最终将因无提示的失败而停止。但是,这被认为是不良行为。确实有几次,我以为它已重新启动,但实际上,关机已因某人而停止。

特别是磁盘操作会导致应用程序关闭时的相关停顿。许多字处理器都在隐藏的临时文件上工作,以进行崩溃恢复。因此,如果用户没有回应,总是可以默认将状态写在那里。

,

您可以像这样使用FormClosing事件:

private void FormTest_FormClosing(object sender,FormClosingEventArgs e)
{
  if ( ThereAreUnsavedChanges )
    switch ( MessageBox.Show("Message",Text,MessageBoxButtons.YesNoCancel,MessageBoxIcon.Question) )
    {
      case DialogResult.Yes:
        DoSave();
        break;
      case DialogResult.No:
        break;
      case DialogResult.Cancel:
        e.Cancel = true;
        break;
    }
}

您可以使用自定义表单而不是消息框:

private void FormTest_FormClosing(object sender,FormClosingEventArgs e)
{
  if ( ThereAreUnsavedChanges )
    switch ( new SaveDataQueryBox().ShowDialog() )
    {
      case DialogResult.Yes:
        DoSave();
        break;
      case DialogResult.No:
        break;
      case DialogResult.Cancel:
        e.Cancel = true;
        break;
    }
}

在此表单中,您将根据用户选择分配DialogResult属性。

  • 在“保存点击事件”按钮中:

    DialogResult = DialogResult.Ok;
    Close();
    
  • 在按钮中,退出点击事件:

    DialogResult = DialogResult.No;
    Close(); 
    
  • 在“取消点击事件”按钮中:

    DialogResult = DialogResult.Cancel; 
    Close(); 
    

对于结束会话,您可以在InitializeComponents之后将其添加到构造函数中:

SystemEvents.SessionEnding += SessionEnding;

添加课程:

private bool IsSessionEnding;

private void SessionEnding(object sender,SessionEndingEventArgs e)
{
  IsSessionEnding = true;
  Close();
}

因此FormClosing将是:

private void FormTest_FormClosing(object sender,FormClosingEventArgs e)
{
  if ( IsSessionEnding)
    // Decide if you want to auto save or not
  else
  if ( ThereAreUnsavedChanges )
    switch ( MessageBox.Show("Message",MessageBoxIcon.Question) )
    {
      case DialogResult.Yes:
        DoSave();
        break;
      case DialogResult.No:
        break;
      case DialogResult.Cancel:
        IsSessionEnding = false;
        e.Cancel = true;
        break;
    }
}

如果不这样做,则在会话结束时会提示用户并且操作系统阻塞,除非设置为强制终止进程,否则会看到应用无响应消息框。

要确保所有表单都将关闭,您可以使用以下方法:

private void CloseForms()
{
  foreach ( Form form in Application.OpenForms )
    if ( form != this && form.Visible )
      try
      {
        form.Close();
      }
      catch
      {
      }
}

例如,您可以从FormClosed事件中调用它。

本文链接:https://www.f2er.com/3128072.html

大家都在问