在WPF App.Current.SessionEnding必须在几秒钟内返回,否则出现"应用程序没有响应"窗口.因此,在此事件处理程序中不能要求用户保存他的数据,因为用户的响应需要的时间超过几秒钟.
我认为解决方案是取消注销/关闭/重启,并在用户回答文件保存对话框时恢复它.
ReasonSessionEnding _reasonSessionEnding;
App.Current.SessionEnding +=
new SessionEndingCancelEventHandler(Current_SessionEnding);
void Current_SessionEnding(object sender, SessionEndingCancelEventArgs e)
{
if (_dataModified)
{
e.Cancel = true;
_reasonSessionEnding = e.ReasonSessionEnding;
Dispatcher.CurrentDispatcher.BeginInvoke(new Action(EndSession));
}
}
void EndSession()
{
if (SaveWithConfirmation()) // if the user didn't press Cancel
//if (_reasonSessionEnding = ReasonSessionEnding.Logoff)
// logoff
//else
// shutdown or restart ?
}
Run Code Online (Sandbox Code Playgroud)
问题是ReasonSessionEnding没有告诉我Windows是关闭还是重新启动(它没有区分两者).
那么,我的程序应该如何处理会话结束事件?它甚至应该做什么,或者在这个事件上什么都不做是标准的?
要求用户将其更改保存在我的主窗体的OnClosing方法中,这样他就不会丢失数据,但我认为"应用程序没有响应"窗口并不表示正常的工作流程.
我想,取消关机是不可取的,因为其他一些程序已经关闭了.
似乎是可接受的方式是无论如何都显示另存为对话框.
取消关闭,然后稍后恢复它肯定不是一个选项,因为你陈述和其他各种原因.
由于简单地丢弃数据是不可接受的,因此实际上没有其他选择.
好吧,除了将数据保存到临时文件,然后在下次运行程序时自动恢复它们.它就像MS Word一样崩溃了.实际上,我越是考虑它,听起来就越好.
编辑:还有另一条途径,即不断保存,例如.MS OneNote可以.令我印象深刻的是,如果你在你的应用程序中实现了不错的多级撤消,那么整个手动存储业务实际上已经过时了 - 从磁盘操作昂贵且容易出错的时代来看,这是一种时代错误,现在大多是旧习惯.
但我很离题.无论如何,它可能不适用于您的应用程序,因为我认为它需要从一开始就实现.
| 归档时间: |
|
| 查看次数: |
2297 次 |
| 最近记录: |