Svi*_*ish 29 c# memento undo-redo
我有一个TextBox,我想为它实现撤消/重做功能.我已经读过它可能已经有一些轻微的撤消功能了,但它有错误吗?无论如何,我想实现撤消和重做功能,也只是为了了解如何继续这样做.
我已经阅读了有关Memento模式的内容,并在CodeProject 上查看了一些关于Generic Undo/Redo示例的内容.而模式kiiind是有道理的.我似乎无法围绕如何实现它.如何有效地做一个内容TextBox.
当然我可以存储的textbox.Text时间TextChanges,但这会非常快地拥抱相当多的内存,特别是如果TextBox包含大量的文本.
所以无论如何,我正在寻找一些关于如何实现良好,清晰和有效的实现此功能的方法的建议.一般而言,特别是对于TextBox c",)
这是一种用最少的代码实现它的方法:(这是一个带有单个文本框的win表单背后的代码)
public partial class Form1 : Form
{
Stack<Func<object>> undoStack = new Stack<Func<object>>();
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<TextBox> Text(this TextBox textBox, string text)
{
return () => { textBox.Text = text; return textBox; };
}
}
Run Code Online (Sandbox Code Playgroud)
通过为其他输入类型实现扩展方法,undoStack可以为整个UI提供服务,按顺序撤消所有UI操作.
| 归档时间: |
|
| 查看次数: |
53675 次 |
| 最近记录: |