首页 文章

如何实现撤消功能?

提问于
浏览
8

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

  • 向对象添加注释

  • 为对象着色

  • 用字符串标记objcet

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

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

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

  • 动作前对象的状态

  • 已采取的实际操作(例如添加到对象注释中的字符串)

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

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

6 回答

  • 0

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

    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

    撤消/重做通常使用Command Pattern实现 . Action 类可以用作此基础,但您需要在每个命令中执行'do'操作和'undo'操作 . Here is an example这在实践中 . 您应该存储在堆栈中执行的命令,因为它使实现更容易,并且用户更容易遵循 .

  • 9

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

  • 2

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

  • 14

    您应该为要撤消的每个操作实现 Command Pattern

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

相关问题