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

标签 c# .net wpf design-patterns undo-redo

关于如何实现这个问题的标题,我已经做了一些研究。我正在开发的应用程序已经开发了几年左右(虽然进展缓慢,但你们都知道它在现实世界中的情况)。现在我需要添加撤消/重做多级功能。现在说“你应该在开始之前就考虑到这一点”有点晚了……好吧,我们确实考虑过了——但我们什么也没做,现在就到了。通过搜索 SO(和外部链接),我可以看到两种最常见的方法似乎是......

Command Pattern

Memento Pattern

命令模式看起来需要大量工作,我只能想象它也会在此过程中抛出数千个错误,所以我不太喜欢那个。

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

  • 您是否知道 Memento 模式的任何可能有效的替代方案。
  • 您认为 Memento 模式是否适合这里,或者它是否会降低应用程序的速度。
  • 如果 Memento 模式是可行的方法,那么制作对象模型快照的最有效方法是什么(我正在考虑序列化它或其他东西)
  • 快照应该存储在内存中还是可以将它们放入文件中?

如果您已经读到这里,感谢您的阅读。您的任何意见都将是宝贵的,我们将不胜感激。

最佳答案

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

1- 您需要多级撤消/重做功能。因此您需要存储执行的用户操作,这些操作可以存储在堆栈中。

2- 你的第二个问题是如何识别我认为通过 Memento 模式的操作改变了什么,这是一个相当大的挑战。 Memento 就是在你的内存中撕裂初始对象状态。

要么,您需要存储操作更改的内容,以便您可以使用此信息撤消操作。

命令模式是为撤消/重做功能而设计的,我想说它已经晚了但值得实现已经使用了几年并且适用于大多数应用程序的设计。

关于c# - 在已经正常运行的应用程序中的 WPF/C# 中撤消重做,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4338066/

相关文章:

c# - Entity Framework 中记录插入的空引用异常

c# - Material Design WPF,如何获取颜色以在边框上使用它

wpf - 样式 WPF 扩展器图标,如 TreeView 扩展器

c# - WPF 文本覆盖网格

c# - 第一次索引数组太慢了

c# - Mutex 对象是否通过引用传递?

c# - ICollection <T> 到字符串数组(使用字符串属性)

c# - 带有用户添加字段的 .net 文本框

c# - 是否可以将属性赋予 ExpectedException 中的消息?

c# - 如何使用转义为\u1234 的 unicode 字符返回 json 结果