.net - 如何在.net windows应用程序中实现 'undo'操作?

标签 .net winforms undo-redo

假设一个 win 表单具有某些输入字段并且用户输入/重新输入一些数据。

如何保留以前通过“撤消”操作输入的数据?

只是我想知道实现它的最佳方法。

最佳答案

有几个选项。重要的是你在项目的早期就开始设计它。如果在设计时没有考虑到这种功能,那么尝试将其添加到现有项目中可能会非常昂贵。
您需要利用一些基本模式:

  • MVCObserver图案。第一个关键不是你的高级架构的宗教或模式狂热者实现。重要的是您的软件能够识别其当前状态和显示状态之间的差异,并适本地解耦。您的视觉状态和应用程序状态之间需要有一个共同的、明确定义的耦合。这为您提供了创建命令所需的通用架构(请参阅#2)。
  • Command图案。您可以通过命令模式获得很多质量(尽管它可能会以一些看起来应该由向导生成的代码为代价)。您对命令模式采取的具体方法可能会有所不同(每个命令一个类,通过覆盖实现,而每个命令一个类,通过事件处理程序实现,例如),但命令是@Ralph 建议构建堆栈的“ Action ”类大约。
    这可能有点棘手,但一般方法是监听将数据从视觉状态“提交”到应用程序状态的事件。 Validated 事件可能是一个很好的 Hook Textbox . Click 事件对于 Button 更有意义.当该提交发生时,您创建与该控件关联的命令,尝试执行该命令,如果该命令成功完成,则将该命令添加到您的撤消堆栈。现在,您正在准确跟踪正在发生的事情以及正在发生的数据。
  • Memento图案。 @JP 解开了最后一 block 拼图。您可以在保存的命令上使用备忘录来存储受影响控件在执行命令之前的状态。这与 UnExecute() 相结合命令界面上的成员,应该是执行任务所需的最后一个核心设计。

  • 像这样的结构化方法的好处是,您现在有了一个自然扩展点,用于需要基于命令发生的其他行为。例如,交易是自然而然的选择。在我当前的项目中,我使用的是 WPF ICommand 接口(interface)(在我的 winforms 项目中)提供有关给定命令是否 CanExecute() 的反馈在任何给定时间。这让我能够以纯命令驱动的方式适本地启用和禁用 UI 小部件。 :)
    不幸的是,Winforms 内置的这种结构并没有很多支持(据我所知),所以你需要从头开始构建它的大部分。没有一个部分是特别复杂的,但是您会发现自己为每个命令生成了大量的大部分样板代码。这也是一种普遍的设计技术。为了使其有效,它必须在应用程序的适当部分中始终如一地使用。这使得改造功能变得相当昂贵,尤其是在原始代码紧密耦合且没有内聚的情况下。

    关于.net - 如何在.net windows应用程序中实现 'undo'操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/800940/

    相关文章:

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

    java - Java 中的撤消和重做实现

    c# - 在 IIS 7 中为运行时的 WCF 项目加载 native 托管和 C++ DLL

    c# - DBcontext.Database.Log : executable sql query

    c# - 在 C# 中定义一天中的时间最简单的方法是什么,即 HH :MM:SS, 而无需求助于需要年、月、日的 DateTime?

    c# - 单声道 winforms 中的版权和商标符号

    c# - 如何正确更改C#中RadioButton组当前选中的RadioButton

    c# - XML 数据中的 & 符号不允许加载 xml

    winforms - 你如何确定 UITestControl 中的(WinForms)控件类型?

    c++ - 撤消历史记录的问题(QUndoStack、QUndoView 和其他)