Domanda

Nella mia applicazione voglio fornire all'utente una funzionalità di undo piccola. Non ci sono molte azioni che possono essere annullate da parte dell'utente. In particolare le azioni sono:

  • Per aggiungere note a un oggetto
  • colore di un oggetto
  • tag un objcet con una stringa

Ora ho pensato a come implementare questa. Ho pensato a una Class Action che è la classe base astratta per le 3 diverse azioni che possono essere intraprese da parte dell'utente. Ogni volta che l'utente assume di queste azioni, viene creata una nuova istanza appropriata di una sottoclasse di questa classe Azione astratta e inserito in un elenco che contiene tutte le azioni.

Ogni volta che l'utente vuole annullare qualcosa, l'elenco viene visualizzato all'utente e lui può scegliere quale azione si vuole disfare.

Ora stavo pensando che cosa deve essere conservato in un tale oggetto di azione:

  • lo stato dell'oggetto prima che l'azione
  • l'azione reale che è stata presa (per esempio la stringa che è stata aggiunta alle note di un oggetto)

Non sono sicuro se questo è sufficiente. Ho anche pensato a qualcosa di simile a un ordinamento cronologico, ma questo dovrebbe essere necessario in quanto la lista può essere mantenuto in ordine cronologico corretto.

Ci sono altre cose devo considerare?

È stato utile?

Soluzione

Undo / redo è comunemente implementato con la Comando modello . La classe Action può essere utilizzato come base per questo, ma è necessario un'azione 'fare' e un'azione 'annullare' all'interno di ogni comando. Ecco un esempio di questo in pratica. Probabilmente si dovrebbe memorizzare i comandi eseguiti in una pila in quanto rende molto più facile da implementare e molto più facile per l'utente di seguire.

Altri suggerimenti

Si potrebbe fare qualcosa di semplice come questo:

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

si dovrebbe attuare il Comando modello per ogni azione che si desidera annullare:

come implementare undo / redo operazione senza grandi cambiamenti di programma

Tutto sembra corretto, ma preferisco usare stack rispetto lista. Sarà utile in aspetto ordine cronologico.

Per una corretta e collaudata applicazione per la funzionalità Undo è Comando modello

E 'difficile si affacciano su questo Simple-Undo -redo-biblioteca-per-Csharp-NET quando si aggiungono funzionalità Undo / Redo di progetti esistenti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top