如何实现撤消功能?

时间:2010-12-13 18:02:19

标签: c# .net architecture system-design

在我的应用程序中,我想为用户提供一个小的撤消功能。用户没有多少动作可以撤消。特别是行动是:

  • 向对象添加备注
  • 为对象着色
  • 使用字符串
  • 标记objcet

现在我想到了如何实现这一点。我首先想到的是一个Action类,它是用户可以采取的3种不同操作的抽象基类。每次用户执行这些操作时,都会创建此抽象Action类的子类的新适当实例,并将其插入包含所有操作的列表中。

每当用户想要撤消某些内容时,该列表会显示给用户,他可以选择要撤消的操作。

现在我在想什么必须存储在这样的动作对象中:

  • 行动前对象的状态
  • 所采取的实际操作(例如,添加到对象注释中的字符串)

我不确定这是否足够。我还考虑过按时间顺序排序,但这应该是必要的,因为列表可以按时间顺序保持正确。

还有其他我应该考虑的事情吗?

6 个答案:

答案 0 :(得分:15)

撤消/重做通常与Command Pattern一起实施。 Action类可用作此基础,但您需要在每个命令中执行“执行”操作和“撤消”操作。 {/ 3}}这在实践中。 您应该将执行的命令存储在堆栈中,因为它使实现起来更容易,并且更容易让用户遵循。

答案 1 :(得分:9)

你可以做这样简单的事情:

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

答案 2 :(得分:5)

您应该为要撤消的每个操作实施命令模式

how to implement undo/redo operation without major changes in program

答案 3 :(得分:2)

一切似乎都是正确的,但我宁愿使用堆栈而不是列表。它在时间顺序方面很有用。

答案 4 :(得分:2)

对于UNDO功能的正确且经过验证的实现是命令模式

答案 5 :(得分:0)

在向现有项目添加撤消/重做功能时,很难忽略此Simple-Undo-redo-library-for-Csharp-NET