我有一个TextBox,我想为它实现撤消/重做功能.我已经读过它可能已经有一些轻微的撤消功能了,但它有错误吗?无论如何,我想实现撤消和重做功能,也只是为了了解如何继续这样做.
我已经阅读了有关Memento模式的内容,并在CodeProject 上查看了一些关于Generic Undo/Redo示例的内容.而模式kiiind是有道理的.我似乎无法围绕如何实现它.如何有效地做一个内容TextBox
.
当然我可以存储的textbox.Text
时间TextChanges
,但这会非常快地拥抱相当多的内存,特别是如果TextBox
包含大量的文本.
所以无论如何,我正在寻找一些关于如何实现良好,清晰和有效的实现此功能的方法的建议.一般而言,特别是对于TextBox c",)
.NET System.ComponentModel
命名空间附带一个IEditableObject
接口,您也可以使用INotifyPropertyChanging
和INotifyPropertyChanged
.MVC模式还可以使您的界面通过事件响应模型中的更改,从而更新或恢复文本框的值.
有效的纪念模式.
你有没看过这些? 这是一个如何.
一个简单快捷的版本是存储文本框的状态OnTextChanged
.每个撤消都将返回Array中的最后一个事件.C#Stack Type在这里很方便.一旦离开界面或之后,您可以清除状态Apply
.
这是一种用最少的代码实现它的方法:(这是一个带有单个文本框的win表单背后的代码)
public partial class Form1 : Form { Stack> undoStack = new Stack >(); public Form1() { InitializeComponent(); } private void textBox_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.U && Control.ModifierKeys == Keys.Control && undoStack.Count > 0) undoStack.Pop()(); } private void textBox_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar != 'u' || Control.ModifierKeys != Keys.Control) { var textBox = (TextBox)sender; undoStack.Push(textBox.Text(textBox.Text)); } } } public static class Extensions { public static Func Text(this TextBox textBox, string text) { return () => { textBox.Text = text; return textBox; }; } }
通过为其他输入类型实现扩展方法,undoStack可以为整个UI提供服务,按顺序撤消所有UI操作.