Pregunta

En mi solicitud Quiero proporcionar al usuario una funcionalidad de deshacer pequeña. No hay muchas acciones que se pueden deshacer por el usuario. En particular, las acciones son:

  • Agregar notas a un objeto
  • color de un objeto
  • etiquetar una objcet con una cadena

Ahora pensé acerca de cómo implementar esto. Pensé por primera vez una clase de acción que es la clase base abstracta para las 3 acciones diferentes que se pueden tomar por parte del usuario. Cada vez que el usuario adquiere una de estas acciones, se crea una nueva instancia apropiada de una subclase de esta clase de acción abstracta y se inserta en una lista que contiene todas las acciones.

Cada vez que el usuario quiere deshacer algo, la lista se muestra al usuario y se puede elegir qué es lo que quiere la acción de deshacer.

Ahora estaba pensando en lo que tiene que ser almacenado en un objeto tal acción:

  • el estado del objeto antes de la acción
  • la acción real que fue tomada (por ejemplo, la cadena que se ha añadido a las notas de un objeto)

No estoy seguro si esto es suficiente. También pensé en algo así como un orden cronológico, pero esto debería ser necesario ya que la lista se puede mantener en orden cronológico correcto.

¿Hay otras cosas que debería tener en cuenta?

¿Fue útil?

Solución

Deshacer / rehacer se implementa habitualmente con el Comando Patrón . La clase Action se puede utilizar como base para esto, pero se necesita una acción de 'hacer' y una acción 'deshacer' dentro de cada comando. Aquí es un ejemplo de esto en práctica. Probablemente debería almacenar los comandos ejecutados en una pila, ya que hace que sea mucho más fácil de implementar y mucho más fácil para el usuario a seguir.

Otros consejos

Se podría hacer algo tan simple como esto:

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

se debe aplicar en el Comando Patrón para cada acción que desea deshacer:

cómo implementar la operación de deshacer / rehacer sin grandes cambios en el programa

Todo parece correcto, pero yo prefiero usar pila de lista. Será útil en aspecto ordenación cronológica.

Para la aplicación correcta y probada para deshacer la funcionalidad es Patrón de comandos

Es difícil pasar por alto esta simple-Deshacer -redo-biblioteca-de-Csharp-NET al agregar funcionalidad de deshacer / rehacer a los proyectos existentes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top