6

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 がシャットダウン中か再起動中かを教えてくれないことです (この 2 つを区別しません)。

では、セッション終了イベントで私のプログラムは何をすべきでしょうか? それは何かをするべきですか、それともこのイベントで何もしないのが標準ですか?

ユーザーはメイン フォームの OnClosing メソッドで変更を保存するように求められるため、データが失われることはありませんが、「アプリケーションが応答しません」というウィンドウは通常のワークフローを示唆していないと思います。

他のプログラムのいくつかはすでにシャットダウンされているため、シャットダウンのキャンセルは望ましくないと思います。

4

1 に答える 1

6

受け入れられているように見えるのは、ダイアログとして保存を表示することです。

シャットダウンをキャンセルして後で再開することは、あなたが述べている理由やその他のさまざまな理由から、おそらくオプションではありません。

単にデータを破棄することは受け入れられないため、他に選択肢はありません。

データを一時ファイルに保存し、次にプログラムを実行したときに自動的に復元することを除いて。クラッシュした後の MS Word のようなものです。実際、考えれば考えるほど良く聞こえます。

編集:さらに別の方法があります。つまり、継続的に保存する方法です。MS OneNote はそうです。前に私を驚かせたのは、アプリケーションにまともなマルチレベルのアンドゥを実装した場合、手動で保存するビジネス全体が実際にはやや時代遅れであるということです。これは、ディスク操作が高価でエラーが発生しやすい時代からの時代錯誤であり、今日ではほとんどが古い習慣です。

しかし、私は脱線しています。とにかく、最初から実装する必要があると思うので、おそらくあなたのアプリケーションには当てはまりません。

于 2009-03-11T00:45:15.000 に答える