WPF 和 Silverlight 的撤销和重做框架

阅读数:1498 2012 年 2 月 19 日

话题:语言 & 开发

用户经常期待富界面里包含撤销和重做两个命令,如果实现得好,可以极大地改善应用程序的可用性。但是,为每个应用程序从头构建这些功能很费时间,还会导致重复劳动。目前至少有两个库可以在这方面帮助 WPF 和 Silverlight 开发者——Infragistics 最近宣布的撤销和重做框架(CTP)以及开源的Undo库。

实现多次撤销和重做功能的常见办法是使用命令模式,通过一个堆栈保存一组撤销命令对象。对于重做,可以通过另一个堆栈保存所有撤销过的命令。但是,当你把下列因素考虑进来时,这个简单的技术很快就会变得复杂:

  • 集合和属性需要分开处理。

  • 多个命令可能是串在一起的,比如说,如果你有一个文本框绑到一个模型的属性,你不想每个击键都被看做一个独立的操作,即使这个模型会在每次击键的时候更新。

这个时候撤销框架就可以派上用场了。Infragistics 的框架在他们的声明里提到了若干特性,包括自定义撤销单元、支持 ObservableCollection 和事务。类似的,Kirill Osenkov写了一个叫Undo的开源框架,支持嵌套事务和操作合并。你可以通过Kirill 的文章和项目文档里深入了解这个框架。 

注意,这些都是线性撤销和重做框架,它们不支持非线性和分支撤销(即用户可以有选择性地撤销之前的任何操作,而不必撤销从那之后的所有东西)。线性撤销和重做情景也有用户体验方面的挑战,尤其在用户期望撤销某些东西,而那些东西却没被记录下来(比如,用户在一个文本框里输入,突然按 Tab 键离开,此时验证无法通过,绑定的属性没有更新)。 

希望以后我们能够看到更多这方面的东西。 

查看英文原文:Undo-Redo Frameworks For WPF and Silverlight