当前位置:  开发笔记 > 编程语言 > 正文

当应用程序有未保存的数据时,处理注销/关闭/重启的正确方法是什么?

如何解决《当应用程序有未保存的数据时,处理注销/关闭/重启的正确方法是什么?》经验,为你挑选了1个好方法。

在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方法中,这样他就不会丢失数据,但我认为"应用程序没有响应"窗口并不表示正常的工作流程.

我想,取消关机是不可取的,因为其他一些程序已经关闭了.



1> Tor Haugen..:

似乎是可接受的方式是无论如何都显示另存为对话框.

取消关闭,然后稍后恢复它肯定不是一个选项,因为你陈述和其他各种原因.

由于简单地丢弃数据是不可接受的,因此实际上没有其他选择.

好吧,除了将数据保存到临时文件,然后在下次运行程序时自动恢复它们.它就像MS Word一样崩溃了.实际上,我越是考虑它,听起来就越好.

编辑:还有另一条途径,即不断保存,例如.MS OneNote可以.令我印象深刻的是,如果你在你的应用程序中实现了不错的多级撤消,那么整个手动存储业务实际上已经过时了 - 从磁盘操作昂贵且容易出错的时代来看,这是一种时代错误,现在大多是旧习惯.

但我很离题.无论如何,它可能不适用于您的应用程序,因为我认为它需要从一开始就实现.

推荐阅读
雯颜哥_135
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有