2009-03-11 2 views
4

In WPF muss App.Current.SessionEnding in einigen Sekunden zurückgegeben werden, andernfalls wird das Fenster "Anwendung reagiert nicht" angezeigt. Daher kann der Benutzer in diesem Ereignishandler nicht aufgefordert werden, seine Daten zu speichern, da die Antwort des Benutzers länger als einige Sekunden dauert.Was ist die richtige Methode für die Abmeldung/das Herunterfahren/Neustarten, wenn die Anwendung nicht gespeicherte Daten enthält?

Ich dachte, eine Lösung wäre, die Abmelde/Shutdown/Neustart abzubrechen, und es wieder aufnehmen, wenn der Benutzer auf die Datei speichern Dialog beantwortet.

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 ? 
    } 

Das Problem ist, dass ReasonSessionEnding mir nicht sagen, ob Windows war herunterzufahren oder neu zu starten (es unterscheidet nicht zwischen den beiden).

Also, was sollte mein Programm für das Session-Ending-Event tun? Sollte es überhaupt etwas tun, oder nichts an diesem Event machen ist der Standard?

Der Benutzer wird gebeten, seine Änderungen in der OnClosing-Methode des Hauptformulars zu speichern, damit er keine Daten verliert, aber ich denke, dass das Fenster "Anwendung reagiert nicht" keinen normalen Workflow vorschlägt.

das Herunterfahren abbrechen nicht erwünscht Ich denke, da einige der anderen Programme nach unten bereits geschlossen wurden.

Antwort

5

Was scheint der akzeptierte Weg ist, den Speichern als Dialog unabhängig anzuzeigen.

das Herunterfahren abbrechen, es dann später wieder aufzunehmen ist sicherlich keine Option, aus dem Grund, Sie angeben, und verschiedene andere.

Da lediglich die Daten zu verwerfen nicht akzeptabel ist, gibt es wirklich keine andere Optionen.

Nun, es sei denn, die Daten in eine temporäre Datei zu speichern und sie dann beim nächsten Mal automatisch die Wiederherstellung das Programm ausgeführt wird. Eher wie MS Word, nachdem es abgestürzt ist. Je mehr ich darüber nachdenke, desto besser klingt es.

Edit: Es gibt noch eine andere Möglichkeit, nämlich kontinuierlich zu speichern, wie zB. MS OneNote tut es. Was mir bisher aufgefallen ist, ist, dass, vorausgesetzt, Sie implementieren anständige mehrstufige Rückgängigmachung in Ihrer Anwendung, das gesamte manuelle Spargeschäft tatsächlich etwas veraltet ist - ein Anachronismus aus den Tagen, als Plattenoperationen teuer und fehleranfällig waren, heutzutage meist alte Gewohnheit.

Aber ich bin abschweifend. Wie auch immer, es ist wahrscheinlich nicht auf Ihre Anwendung anwendbar, da ich mir vorstelle, dass es von Anfang an implementiert werden muss.

+0

+1. Wenn Sie können, speichern Sie sie an einem bekannten temporären Speicherort. Dies ist die beste Option in meinen Büchern. –

Verwandte Themen