首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >撤消/重做备忘录到模式c#

撤消/重做备忘录到模式c#
EN

Stack Overflow用户
提问于 2017-02-10 21:27:20
回答 2查看 2.3K关注 0票数 1

我正在尝试在C# (treeView组件)中实现树的节点的撤消/重做功能。我已经使用了memento模式,但我在重做部分遇到了问题。我看不出我的逻辑在哪里有缺陷。以下是代码的一些截图

代码语言:javascript
运行
复制
    private List<Memento> _mementoStateList= new List<Memento>();
    private List<Memento> _undoStateList= new List<Memento>();
    public Memento Memento { get{return null;}
        set{_mementoStateList.Add(value);} }

    public Memento Undo()
    {
        if (!_mementoStateList.Any()) return null;
        Memento m = _mementoStateList.Last();
        _undoStateList.Add(m);
        _mementoStateList.Remove(m);
        return m;
    }

    public Memento Redo()
    {
        if (!_undoStateList.Any()) return null;
        Memento m = _undoStateList.Last();
        _mementoStateList.Add(m);
        _undoStateList.Remove(m);
        return m;
    }

在我的表单中,在删除节点之前,我调用了SaveMemento()方法,该方法创建一个表示当前状态的新Memento对象。该对象将添加到_mementoStateList中。

当撤销和重做一个动作时,我调用上面的Undo()和Redo()方法。

我想我没有在正确的时机拯救国家吧?任何意见都是非常感谢的!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-11 22:21:32

也许你应该考虑使用Command模式实现撤销/重做,而使用Memento如果你需要存储很多状态(实际上问题是你将支持多少撤销操作),那么实现可能会很繁重。

票数 0
EN

Stack Overflow用户

发布于 2017-02-10 21:37:21

在创建memento时,您必须对对象树进行深度克隆,否则memento将只是对当前状态的引用。在这种情况下,对状态的任何更改都将反映到所有纪念品,破坏任何保留先前(或潜在的未来)状态的历史的尝试。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42160538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档