9

在我的应用程序中,我想为用户提供一个小的撤消功能。用户可以撤消的操作并不多。具体行动如下:

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

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

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

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

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

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

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

4

5 回答 5

17

撤消/重做通常使用命令模式来实现。该类Action可用作此操作的基础,但您需要在每个命令中执行“执行”操作和“撤消”操作。 这是实践中的一个例子。您可能应该将执行的命令存储在堆栈中,因为它更容易实现并且更易于用户遵循。

于 2010-12-13T18:11:42.023 回答
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;
}
于 2010-12-13T18:08:46.557 回答
5

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

如何在程序没有重大变化的情况下实现撤消/重做操作

于 2010-12-13T18:10:12.620 回答
2

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

于 2010-12-13T18:08:34.030 回答
0

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

于 2013-05-17T01:50:45.627 回答