在已经正常运行的应用程序中撤消WPF/C#中的重做

DrL*_*zer 4 .net c# wpf design-patterns undo-redo

我已经就如何实现这个问题的标题做了一些研究.我正在开发的应用程序已经开发了几年左右(虽然进展缓慢,但你们都知道它在现实世界中的表现如何).现在要求我放入Undo/Redo多级功能.说"在开始之前你应该考虑过这个问题"已经有点晚了......好吧,我们确实考虑过这个问题 - 而我们对它没有做任何事情,而现在它就是这样.从搜索SO(和外部链接)我可以看到两种最常见的方法似乎是......

命令模式

纪念品模式

命令模式看起来像是一项很多工作,我只能想象它在这个过程中会抛出数千个错误,所以我真的不喜欢那个.

Memento模式实际上与我脑子里的模式很像.我在想是否有某种方法可以快速拍摄当前在内存中的对象模型的快照,然后我就可以将它存储在某个地方(也可能存储在内存中,也可能存储在文件中).这似乎是一个好主意,我能看到的唯一问题是它如何与我们已经编写的内容集成.您可以看到应用程序,因为它在大面板(可能是数百个)中绘制图像,然后允许用户通过UI或通过自定义构建的属性网格来操作它们.整个应用程序与一个大的观察者模式相关联.第二个任何变化,事件被触发,所有需要更新的事情都会发生.这很好,但我不能帮助以为如果用户在属性网格上的文本域中输入文本,在UI赶上之前会有一些延迟(似乎每次用户按下一个键时,都会添加一个新的快照到撤消列表).所以我的问题是......

  • 你知道可能有效的Memento模式的任何好的替代品吗?
  • 你认为Memento模式适合这里还是会减慢应用程序的速度.
  • 如果Memento模式是要走的路,那么制作对象模型快照的最有效方法是什么(我正在考虑序列化它或什么的)
  • 快照应该存储在内存中还是可以将它们放入文件中?

如果你有这么远,那么请你好好阅读.您的任何输入都将非常有价值,非常感谢.

Tal*_*ner 5

好吧,这是我对这个问题的看法.

1-您需要多级撤消/重做功能.所以你需要存储可以存储在堆栈中的用户操作.

2-你的第二个问题是如何通过Memento模式来识别操作所改变的内容,这是一个相当大的挑战.纪念品是关于在你的记忆中扭曲初始对象状态.

或者,您需要存储操作更改的内容,以便您可以使用此信息来撤消操作.

命令模式是为Undo/Redo功能而设计的,我想说它的实施时间已经很晚了,但实际上已经使用了几年并适用于大多数应用程序的设计.