Frage

In meiner Anwendung mag ich den Benutzer mit einer kleinen Undo-Funktionalität bereitzustellen. Es gibt nicht viele Aktionen als durch den Benutzer rückgängig gemacht werden. Vor allem die Aktionen sind:

  • Hinzufügen von Notizen zu einem Objekt
  • Farbe ein Objekt
  • Tag ein objcet mit einem String

Jetzt habe ich darüber nachgedacht, wie dies umzusetzen. Ich dachte zuerst eine Action-Klasse, die die abstrakte Basisklasse für die 3 verschiedenen Aktionen, die vom Benutzer getroffen werden können. Jedes Mal, wenn der Benutzer auf diesen Aktionen nimmt eine neue geeignete Instanz einer Unterklasse dieser abstrakten Action-Klasse wird in eine Liste erstellt und eingefügt, die alle Aktionen enthalten.

Wenn der Benutzer rückgängig machen etwas will, wird die Liste dem Benutzer angezeigt wird, und er kann entscheiden, welche Aktion er rückgängig machen wollen.

Nun dachte ich, was in einem solchen Aktionsobjekt gespeichert werden muss:

  • der Zustand des Objekts vor der Aktion
  • die eigentliche Aktion, die ergriffen wurde (zum Beispiel der Zeichenfolge, die zu einem Objekt Notiz hinzugefügt wurden)

Ich bin nicht sicher, ob dies genug. Ich dachte auch über so etwas wie eine chronologische Ordnung, aber dies erforderlich sein sollte, da die Liste chronologisch korrekt beibehalten werden kann.

Gibt es noch andere Dinge, die ich beachten sollte?

War es hilfreich?

Lösung

Undo / Redo wird allgemein umgesetzt mit dem Command-Muster . Die Action Klasse kann als Grundlage dafür verwendet werden, aber man braucht eine ‚do‘ Aktion und eine ‚Undo‘ Aktion in jedem Befehl. Hier ist ein Beispiel dies in trainieren. Sie sollten wahrscheinlich die Befehle in einem Stapel ausgeführt speichern, wie es es viel einfacher zu implementieren und zu viel für den Benutzer einfacher macht zu folgen.

Andere Tipps

Sie könnten etwas einfach tun wie folgt aus:

Stack<Action> undoStack = new Stack<Action>();    

void ChangeColor(Color color)
{
    var original = this.Object.Color;
    undoStack.Push(() => this.Object.Color = original);
    this.Object.Color = color;
}

Sie sollten die Command-Muster implementieren für jede Aktion möchten Sie undo:

wie implementieren Undo / Redo-Operation ohne größere Änderungen in dem Programm

scheint alle richtig, aber ich würde lieber Stack als Liste verwenden. Es wird in chronologischer Reihenfolge Aspekte nützlich sein.

Für korrekte und bewährte Implementierung für UNDO Funktionalität ist Command-Muster

Es ist schwer, dieses Simple-Undo zu übersehen -redo-Bibliothek-for-Csharp-NET beim Hinzufügen von Undo / Redo-Funktionalität zu bestehenden Projekten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top