可以進行多步撤消(Undo、Redo)的TextBox

來源:互聯網
上載者:User

 

預設的TextBox只能進行一步撤消,且不存在Redo操作(二次撤消相當於一次Redo)。以下這個組件實現了TextBox的多步撤消(Undo、Redo)操作,代碼改編於Kevin.SyntaxTextBox(原代碼是針對RichTextBox實現的Undo、Redo功能)。 using System;using System.Collections.Generic;using System.Windows.Forms;namespace Ekinglong.Drawing.Forms{    /// <summary>     /// 可以執行多步撤消操作的TextBox     /// </summary>     public partial class TextBoxEx : TextBox    {        //Undo/Redo members         private List<UndoRedoInfo> mUndoList = new List<UndoRedoInfo>();        private Stack<UndoRedoInfo> mRedoStack = new Stack<UndoRedoInfo>();        private bool mIsUndo = false;        private UndoRedoInfo mLastInfo = new UndoRedoInfo("", 0);        private int mMaxUndoRedoSteps = 50;        /// <summary>         /// The on text changed overrided.         /// </summary>         /// <param name="e"> </param>         protected override void OnTextChanged(EventArgs e)        {            base.OnTextChanged(e);            if (!mIsUndo)            {                mRedoStack.Clear();                mUndoList.Insert(0, mLastInfo);                this.LimitUndo();                mLastInfo = new UndoRedoInfo(Text, SelectionStart);            }            //Invalidate();         }        /// <summary>         /// 設定和擷取撤消操作允許的最大步數         /// </summary>         public int MaxUndoRedoSteps        {            set { mMaxUndoRedoSteps = value; }            get { return mMaxUndoRedoSteps; }        }        /// <summary>         /// 清空Undo、Redo操作資訊         /// </summary>         public void ClearUndoAndRedo()        {            mUndoList.Clear();            mRedoStack.Clear();        }        /// <summary>         /// 判斷是否可以進行Undo操作         /// </summary>         public new bool CanUndo        {            get { return mUndoList.Count > 0; }        }        /// <summary>         /// 判斷是否可以進行Redo操作         /// </summary>         public bool CanRedo        {            get { return mRedoStack.Count > 0; }        }        /// <summary>         /// 撤消操作         /// </summary>         public new void Undo()        {            if (!CanUndo)                return;            mIsUndo = true;            mRedoStack.Push(new UndoRedoInfo(Text, SelectionStart));            UndoRedoInfo info = (UndoRedoInfo) mUndoList[0];            mUndoList.RemoveAt(0);            Text = info.Text;            SelectionStart = info.CursorLocation;            ScrollToCaret();            mLastInfo = info;            mIsUndo = false;        }        /// <summary>         /// 重複操作         /// </summary>         public void Redo()        {            if (!CanRedo)                return;            mIsUndo = true;            mUndoList.Insert(0, new UndoRedoInfo(Text, SelectionStart));            LimitUndo();            UndoRedoInfo info = (UndoRedoInfo) mRedoStack.Pop();            Text = info.Text;            SelectionStart = info.CursorLocation;            ScrollToCaret();            mIsUndo = false;        }        private void LimitUndo()        {            while (mUndoList.Count > mMaxUndoRedoSteps)            {                mUndoList.RemoveAt(mMaxUndoRedoSteps);            }        }        private class UndoRedoInfo        {            public UndoRedoInfo(string text, int cursorLoc)            {                Text = text;                CursorLocation = cursorLoc;            }            public readonly int CursorLocation;            public readonly string Text;        }    }}
http://www.chenjiliang.com/Article/View.aspx?ArticleID=19079

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.