我有一个C#Windows窗体应用程序
在应用程序关闭之前,我想显示一个“未保存的更改。保存/退出/取消”样式确认对话框。可能同时防止应用程序关闭。我该怎么办?
如果应用程序无法关闭,Windows 10上的关机过程会发生什么?
我有一个C#Windows窗体应用程序
在应用程序关闭之前,我想显示一个“未保存的更改。保存/退出/取消”样式确认对话框。可能同时防止应用程序关闭。我该怎么办?
如果应用程序无法关闭,Windows 10上的关机过程会发生什么?
取决于显示技术(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事件中调用它。