首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[C#][转载]实现richtextbox的多步撤消(Undo、Redo)?

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

作者头像
云未归来
发布2025-07-18 14:36:29
发布2025-07-18 14:36:29
470
举报

下面是针对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;          }      }  }

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-07-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档