如何在.net windows应用程序中实现"撤销"操作?

Dha*_*ana 11 .net undo-redo winforms

假设,win表单具有某些输入字段,用户输入/重新输入一些数据.

如何保留"撤消"操作先前输入的数据?

我想知道完成它的最佳方法.

Gre*_*g D 14

有几个选择.重要的是你在项目的早期开始设计它.如果没有考虑到这种能力,尝试将其添加到现有项目可能会非常昂贵.

您需要利用以下几种基本模式:

  1. MVCObserver模式.第一个关键不在于您的高级架构的宗教或模式 - 狂热实现.什么重要的是,你的软件可以识别它的当前状态和显示状态之间的差异,并适当地解耦.您的可视状态和应用程序状态之间需要有一个共同的,明确定义的耦合.这为您提供了创建命令所需的通用架构(参见#2).

  2. 命令的模式.使用命令模式可以获得很多质量(尽管它可能以某些代码为代价,看起来应该是向导生成的代码).您对命令模式采取的具体方法可能有所不同(每个命令一个类通过覆盖实现,而每个命令通过事件处理程序实现一个类,例如),但命令是@Ralph建议构建堆栈的"action"类周围.

    这可能有点棘手,但一般的方法是监听将视觉状态"提交"到应用程序状态的事件.该Validated事件可能是一个很好的钩子Textbox.这个Click事件会更有意义Button.当提交发生时,您创建与该控件关联的命令,尝试执行该命令,并在命令成功完成时将命令添加到撤消堆栈.现在,您正在准确地跟踪正在发生的事情以及它正在发生的数据.

  3. 备忘录的模式.@JP拉出最后一块拼图.您可以在保存的命令上使用纪念品来存储执行命令之前受影响控件的状态.这与UnExecute()命令界面上的成员相结合,应该是执行任务所需的最后一个核心设计.

像这样的结构化方法的好处是,您现在有一个自然的扩展点,可以在需要基于命令的情况下发生其他行为.例如,交易是很自然的.在我当前的项目中,我正在使用WPF ICommand接口(在我的winforms项目中)提供有关CanExecute()在任何给定时间是否给定命令的反馈.这使我可以以纯粹的命令驱动方式适当地启用和禁用UI小部件.:)

不幸的是,Winforms内置的这个结构并没有很多支持(据我所知),所以你需要从头开始构建它的大部分内容.没有一件事特别复杂,但你可以发现自己为每个命令生成了大量的大部分样板代码.它也是一种普遍的设计技术.为了使其有效,必须在应用程序的适当部分中始终如一地使用它.这使得改进功能非常昂贵,特别是如果原始代码紧密耦合且不连贯.