当前位置:  开发笔记 > 编程语言 > 正文

如何为TextBox实现高效的撤消/重做功能

如何解决《如何为TextBox实现高效的撤消/重做功能》经验,为你挑选了2个好方法。

我有一个TextBox,我想为它实现撤消/重做功能.我已经读过它可能已经有一些轻微的撤消功能了,但它有错误吗?无论如何,我想实现撤消和重做功能,也只是为了了解如何继续这样做.

我已经阅读了有关Memento模式的内容,并在CodeProject 上查看了一些关于Generic Undo/Redo示例的内容.而模式kiiind是有道理的.我似乎无法围绕如何实现它.如何有效地做一个内容TextBox.

当然我可以存储的textbox.Text时间TextChanges,但这会非常快地拥抱相当多的内存,特别是如果TextBox包含大量的文本.

所以无论如何,我正在寻找一些关于如何实现良好,清晰和有效的实现此功能的方法的建议.一般而言,特别是对于TextBox c",)



1> REA_ANDREW..:

.NET System.ComponentModel命名空间附带一个IEditableObject接口,您也可以使用INotifyPropertyChangingINotifyPropertyChanged.MVC模式还可以使您的界面通过事件响应模型中的更改,从而更新或恢复文本框的值.

有效的纪念模式.

你有没看过这些? 这是一个如何.

一个简单快捷的版本是存储文本框的状态OnTextChanged.每个撤消都将返回Array中的最后一个事件.C#Stack Type在这里很方便.一旦离开界面或之后,您可以清除状态Apply.



2> jdoig..:

这是一种用最少的代码实现它的方法:(这是一个带有单个文本框的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操作.


@Jack再次阅读最后一句话.此代码可以扩展为允许您以相反的顺序撤消整个表单中*any*控件的*any*更改.
推荐阅读
贾志军
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有