在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 ? }
问题是ReasonSessionEnding没有告诉我Windows是关闭还是重新启动(它没有区分两者).
那么,我的程序应该如何处理会话结束事件?它甚至应该做什么,或者在这个事件上什么都不做是标准的?
要求用户将其更改保存在我的主窗体的OnClosing方法中,这样他就不会丢失数据,但我认为"应用程序没有响应"窗口并不表示正常的工作流程.
我想,取消关机是不可取的,因为其他一些程序已经关闭了.
似乎是可接受的方式是无论如何都显示另存为对话框.
取消关闭,然后稍后恢复它肯定不是一个选项,因为你陈述和其他各种原因.
由于简单地丢弃数据是不可接受的,因此实际上没有其他选择.
好吧,除了将数据保存到临时文件,然后在下次运行程序时自动恢复它们.它就像MS Word一样崩溃了.实际上,我越是考虑它,听起来就越好.
编辑:还有另一条途径,即不断保存,例如.MS OneNote可以.令我印象深刻的是,如果你在你的应用程序中实现了不错的多级撤消,那么整个手动存储业务实际上已经过时了 - 从磁盘操作昂贵且容易出错的时代来看,这是一种时代错误,现在大多是旧习惯.
但我很离题.无论如何,它可能不适用于您的应用程序,因为我认为它需要从一开始就实现.