[C#][转载]实现richtextbox的多步撤消(Undo、Redo)?

下面是针对textbox的。高手参照此资料做一个richtextbox,
[C#]可以进行多步撤消(Undo、Redo)的TextBox 

默认的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;
         }
     }
 }

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FL1623863129

你的打赏是我写文章最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值