首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在Winforms的富文本框中逐字撤消和重做

在WinForms应用程序中实现富文本框(RichTextBox)的逐字撤销和重做功能,可以通过以下步骤来完成:

基础概念

  • 撤销(Undo):允许用户取消最近的编辑操作。
  • 重做(Redo):允许用户重新应用之前取消的操作。

相关优势

  • 提高用户体验,使用户能够轻松修正错误。
  • 减少因误操作导致的数据丢失风险。

类型

  • 逐字撤销/重做:每次编辑操作都会被单独记录,用户可以逐字地撤销或重做。
  • 块撤销/重做:将多个连续的编辑操作作为一个单元进行撤销或重做。

应用场景

  • 文本编辑器
  • 论坛发帖
  • 博客编辑器

实现方法

WinForms的RichTextBox控件本身支持基本的撤销和重做功能,但默认情况下是以块为单位进行的。要实现逐字撤销和重做,需要自定义逻辑。

示例代码

以下是一个简单的示例,展示如何在WinForms中实现逐字撤销和重做:

代码语言:txt
复制
using System;
using System.Collections.Generic;
using System.Windows.Forms;

public class CustomRichTextBox : RichTextBox
{
    private Stack<string> undoStack = new Stack<string>();
    private Stack<string> redoStack = new Stack<string>();

    protected override void OnTextChanged(EventArgs e)
    {
        base.OnTextChanged(e);
        if (!isUndoing && !isRedoing)
        {
            undoStack.Push(Text);
            redoStack.Clear();
        }
    }

    private bool isUndoing = false;
    private bool isRedoing = false;

    public void Undo()
    {
        isUndoing = true;
        if (undoStack.Count > 1)
        {
            redoStack.Push(undoStack.Pop());
            Text = undoStack.Peek();
        }
        isUndoing = false;
    }

    public void Redo()
    {
        isRedoing = true;
        if (redoStack.Count > 0)
        {
            undoStack.Push(redoStack.Pop());
            Text = undoStack.Peek();
        }
        isRedoing = false;
    }
}

public partial class MainForm : Form
{
    private CustomRichTextBox richTextBox;

    public MainForm()
    {
        InitializeComponent();
        richTextBox = new CustomRichTextBox();
        richTextBox.Dock = DockStyle.Fill;
        Controls.Add(richTextBox);

        Button undoButton = new Button { Text = "Undo", Dock = DockStyle.Left };
        undoButton.Click += (sender, e) => richTextBox.Undo();
        Controls.Add(undoButton);

        Button redoButton = new Button { Text = "Redo", Dock = DockStyle.Left };
        redoButton.Click += (sender, e) => richTextBox.Redo();
        Controls.Add(redoButton);
    }
}

可能遇到的问题及解决方法

  1. 性能问题:频繁的文本更改可能导致性能下降。
    • 解决方法:可以考虑使用定时器来减少撤销操作的频率,或者在文本变化较大时才进行撤销记录。
  • 撤销栈溢出:如果用户进行了大量的编辑操作,撤销栈可能会变得非常大。
    • 解决方法:可以设置一个最大撤销步数,超过这个步数后自动清除最早的记录。
  • 撤销和重做状态不一致:在某些情况下,撤销和重做按钮的状态可能不会正确更新。
    • 解决方法:确保在每次文本更改后更新按钮的状态,并在撤销和重做操作后及时更新。

通过上述方法,可以在WinForms中实现一个基本的逐字撤销和重做功能,提升用户体验。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

qlineedit_qt layoutstretch

QLineEdit允许用户输入和编辑单行纯文本,提供了很多有用的编辑功能,包括:撤消和重做、剪切和粘贴、以及拖放(见setDragEnabled())。...内容 详细介绍 与其相关的一个类是QTextEdit – 允许多行、富文本编辑。...粘贴剪贴板的文本到输入框中 Ctrl+X 剪切选中的文本到剪贴板 Shift+Delete 剪切选中的文本到剪贴板 Ctrl+Z 撤销上一次操作 Ctrl+Y 重做上一次操作 共有类型 枚举:QLineEdit...默认值为Normal 最常用的设置是Normal,用户输入文本被逐字显示;还包含其它模糊输入,例如:NoEcho、Password和PasswordEchoOnEdit。...关闭大小写转换 \ 使用 \ 去转义上述列出的字符。 掩码由掩码字符和分隔符字符串组成,后面可以跟一个分号和用于空白的字符,空白字符在编辑后总是从文本中删除。

2.2K30
  • WPFSilverlight中的Command

    命令模式把一个请求或者操作封装到一个对象中。命令模式允许系统使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能。...在我们日常的应用程序操作中,经常要处理各种各样的命令和进行相关的事件处理,比如需要复制、粘贴文本框中的内容;上网查看网页时,可能需要返回上一网页 查看相应内容;而当我们播放视频和多媒体时,我们可能要调节音量...在Winform编程中,我们经常使用各种各样的控件来 解决此类问题,当然我们也必须编写一堆代码来处理各种各样的命令和事件处理。...比如文本框TextBox就提供了复制(Copy),粘贴(Paste),裁切(Cut),撤消(Undo)和重做(Redo)命令等。...项目中也打造一套自己的Command,特别是与UI元素耦合以及不支持命令组合,所以他们在Prism中便增加了另外一套Command:DelegateCommand和CompositeCommand。

    89850

    表格控件:计算引擎、报表、集算表

    同时,可以将某个工作表(Worksheet)的配置 rightToLeft 为 true,将从整体外观上形成从右到左的形式,如下图: 富文本支持项目符号列表 作为富文本格式的一部分,现在支持使用无序项目符号和有序编号列表...这也可以在SpreadJS设计器中启用: 将形状和图表复制为图像 现在可以将形状、图表和切片器复制到剪贴板并另存为图像。...这样,设计器中就有了一个用于设置 AutoFit 属性的新 API 和一个新界面设置: 页总计 报表插件的 R.V 函数生成工作表中溢出单元格的值。在新版本中,添加了另一个参数来指定当前页面。...修改时间 日期 在记录字段更新时设置日期 附件 对象 允许直接在记录上附加文件 条码 取决于输入 从字段生成指定的条形码 撤销重做支持 新版本集算表添加了撤消和重做支持,允许用户撤消/重做以下类别的操作...方法除外) 同样,在表格编辑器中也支持撤销重做。

    13710

    【Mysql-InnoDB 系列】InnoDB 架构

    3.5 重做日志 重做日志(redo log)是一种基于磁盘的数据结构,用于在崩溃恢复期间更正由不完整事务写入的数据。...在正常的操作中,重做日志对SQL语句或低级API调用产生的更改表数据的请求进行编码。在意外关闭之前未完成数据文件更新的修改,将在初始化期间和接受连接之前自动重放。...默认情况下,重做日志在磁盘上的物理标识是名为ib_logfile0 和 ib_logfile1的两个文件。MySQL以循环方式写入重做日志文件。...如果另一个事务需要将原始数据视为一致读取操作的一部分,则会从撤消日志记录中检索未修改的数据。撤消日志存在于撤消日志段中,而撤消日志段包含在回滚段中。...回滚段驻留在undo表空间和全局临时表空间中。 驻留在全局临时表空间中的撤消日志,用于用户定义的临时表中修改数据的事务。这些撤消日志不是重做日志,因为崩溃恢复不需要它们。

    1.2K10

    软件界面中一些易混淆易用错的界面文案,以及一些约定俗成的文案约定

    无论哪一种,都说明了理由和可溯源的资料。 撤销 / 撤消 推荐:在软件界面中推荐使用 “撤销”。应该逐渐淘汰“撤消”的使用。 实际:国产软件主要使用“撤销”,而国外软件的中文版本两者都有使用。...Windows 系统和 Office 套件使用的是“撤消”: 撤销恢复 / 撤销重做,撤消恢复 / 撤消重做 正确:恢复。 撤销:Undo。恢复:Redo。重做:Repeat。...有些软件会出现此错误,估计跟 Office 的使用有关。 在正常情况下,Office 的左上角有一对按钮:“撤消” 和 “重做”。但是,“重做” 的意思真的是 “重复上一步操作”。...因此,如果只是在 Office 软件里看了一眼就把文案抄过来了,那就会出现 “撤消重做” 这样的误用;实际上应该是 “撤销恢复”。...在 第一批异形词整理表 中对于 “账” 和 “帐” 的用法有一项相关的说明,明确 “账本”(zhàngběn)一词是普通话书面语中推荐的使用词形,而 “帐本” 是 “账本” 异形词。

    17860

    Swing 的 undo 包实现撤销重做功能

    和 getRedoPresentationName() 返回此编辑可重复执行形式的说明。 如果end已调用此电话为超。 否则,如果有编辑重做,这种回报从下一个显著的编辑将要恢复的价值。...比如,如果要在菜单中提供“撤消删除”,“重做删除”菜单项而不是简单的无所指的“撤消”,“重做”菜单项,可以通过这两个方法来获得。...MVC架构中,JList是一个View类,操作内部数据的能力来自于它的数据模型类ListModel 推荐阅读:Java中的JList和DefaultListModel的亲密关系 ListEdit抽象类...在execute方法中实现操作逻辑,在undo方法中实现Undo的逻辑。redo方法在ListEdit中已经实现 一个需要注意的问题是,在实现执行逻辑时要保留现场数据,以供Undo时恢复现场。...4 调用Undo/Redo 在“撤消”按钮的事件处理器中,直接调用UndoManager的undo方法; 在“重做”按钮的事件处理器中,直接调用UndoManager的redo方法。

    99920

    dotnet 文档应用的撤销重做设计

    本文来告诉大家撤销重做这个模块的设计路线,从简单的复杂 大部分的应用软件都可以采用敏捷开发,不断进行迭代。应用的每个小功能都在不断迭代中,成为模块或者某个团队产品。...本文记录的功能的迭代也仅仅只是在我当前团队里面,跟随产品逐步修改的,不一定适合你当前的团队 本文以下的撤销重做和撤销恢复说的是相同的功能。...但是本质上这个词是我当前团队用错的,如在Word里面的重做,也就是标题上左上角的按钮,其实指的是当前的输入再次输入,而恢复只有在用户点击撤销之后,才会看到恢复按钮 默认在 WPF 或 UWP 等应用的文本框或者富文本框里面都有自带的撤销恢复机制...另外,从撤销重做的业务上,也不需要使用抽象类,只需要有撤销和重做两个方法就可以 在应用程序可以根据业务定义多个撤销重做栈的内容,例如说做一个和 PPT 差很多的软件,有编辑和播放两个不同的界面,这两个界面的撤销重做相互独立...在我进入特殊的模式,例如是插入某个复杂元素,如公式,允许在公式里面编辑文本和图片。此时在插入公式过程中,编辑文本和图片每一步都可以撤销,而在插入公式完成之后,撤销的是整个公式。

    68040

    MySQL 8.0.21中新的数据文件位置一致性

    作者:Kevin Lewis 译:徐轶韬 在MySQL 8.0中创建常规表空间时,可以选择创建关联数据文件的目录。...启动时,InnoDB会首先搜索已知目录中的表空间数据文件,之后再进行恢复。由于表空间目录没有存储在MySQL 8.0的重做日志中,恢复时需要依赖已知目录来查找和打开数据文件。...崩溃后,如果重做日志包含对这些文件的更改,则必须将这些数据文件目录添加到–innodb-directories,MySQL才能够启动。如果由于表空间尚未打开而无法应用重做日志,则恢复启动将失败。...也就是说,它是在datadir下以该模式命名的目录中创建。...但之前可以在唯一的撤消目录中创建非撤消表空间。如果使用先前的MySQL版本在唯一的撤销目录中创建了一些非撤消表空间,升级到MySQL 8.0.21后,InnoDB会允许它存在。

    1.6K30

    “老坛泡新菜”:SOD MVVM框架,让WinForms焕发新春

    效果和整体开发质量,开发效率没有得到有效提高,要过度到WPF开发这种不同开发风格的技术难度又比较大,所以,如果有一种能够在 WinForms 上的MVVM框架,无疑是广大后端.NET程序员的福音。...在.NET中,实现这种通知功能的接口就是:  INotifyPropertyChanged 它的定义在System.dll 中,早在 .NET 2.0 就已经支持。...这样,在视图上做简单的数据属性设置和写少量的code behind绑定代码,一个具有双向绑定功能的程序就好了。...在本例中,我们的用户视图模型的功能也很简单,就是提供视图需要的用户列表和响应视图的增加,修改,删除用户的命令,详细代码如下 public class SubmitedUsersViewModel...SOD WinForms MVVM支持 自SOD框架版本 5.6.0.1111 发布的这个“光棍节“版本中,您已经可以在此以后的版本中获得直接的WinForms MVVM支持,如果是之前的版本,那么需要本示例程序一样稍微多做一点工作

    3.8K60

    每日一练:完全恢复与不完全恢复概念

    “这意味着缺少交易;从恢复目标时间到现在所做的任何数据修改都将丢失。在许多情况下,这是理想的目标,因为可能对数据库进行了一些需要撤消的更改。恢复到过去的某个点是解决用户误操作的一种方法。 2....以下步骤描述了在完全恢复期间发生的情况: 从备份中恢复损坏或丢失的文件。 根据需要应用增量备份、归档重做日志文件和在线重做日志文件的更改。...要执行时间点恢复,需要: 在恢复点之前对所有数据文件进行有效的脱机或联机备份 从备份到指定恢复时间的所有归档日志 执行时间点恢复的步骤如下: 从备份中恢复数据文件:所使用的备份必须来自目标恢复点之前。...过度恢复状态:State of over-recovery:现在数据文件包含一些已提交和一些未提交的事务,因为重做日志包含未提交的数据。...使用ALTER DATABASE OPEN命令:在应用undo之前打开数据库。这是为了提供更高的可用性。 5.应用undo数据:在应用重做的同时,也应用了支持undo数据文件的重做日志。

    77020

    鼠标教鞭:Presentify for mac

    想要注释任何屏幕,突出显示光标,Presentify Mac版绝对是您的首选,该软件拥有随时随地画画、高亮显示鼠标指针、撤消/重做支持等强大功能,简便易用非常不错。...按住Shift键的同时,可以用一只手在绘制时获得一条直线。您可以在绘制时按住Shift键,以半透明的颜色填充矩形和圆形。自动删除您的注释。非常适合强调特定内容或解释您的想法。...非常适合现场演示和远程工作时的视频通话。在通过Sidecar或Astropad连接到Macbook的iPad上运行。与XP笔一起使用。...3、键盘快捷键您可以使用简单的键盘快捷键在任何应用程序中注释屏幕,突出显示光标,更改绘图颜色和形状等。4、撤消/重做支持注释时不必担心错误。5、多屏支持在多个屏幕上进行注释,而不必打开/关闭注释。...为每个屏幕保存的会话,因此在屏幕之间切换时无需切换控件,颜色等。每个屏幕都有自己的撤消/重做堆栈,因此您会意外擦除看不见的内容。6、白板如果需要,可以在白板上绘制(不要在其他应用程序上绘制)。

    89040

    Quill 富文本编辑器简介

    由于这个限制,大多数富文本编辑器不能回答诸如: “这个范围内有什么文字?” 或者 “光标处是粗体吗?” 这些简单问题。这使得在现有基础上,尝试打造丰富的编辑体验是一件非常困难和难受的事情。...自定义内容和格式 过去评估富文本编辑器就像比较所需格式的清单一样简单。衡量一个富文本编辑器好坏的指标就是它所能支持的格式。这仍然是一个重要的衡量标准,但下限接近无穷大。 文本不再只是用于打印。...这与在工具栏中添加控件是不一样的。比如,你可以配置 Quill 以允许将粗体内容粘贴到工具栏上没有包含粗体按钮的编辑器中。...历史模块 历史记录模块负责处理 Quill 的撤消和重做。...如果小伙伴们也对 Quill 感兴趣,建议在熟悉官方文档及相关 API 的基础上,在深入了解一下 Delta 和 Parchment 的概念。

    3.8K20

    Vs Code 2020年6月(1.47版)

    源代码管理统一视图 -所有存储库显示在单个视图中。 查看和排序挂起的更改 -以树或列表的形式查看文件,按名称,路径或状态排序。 编辑复杂设置 -从“设置”编辑器中编辑对象设置。...新的HexEditor扩展名 -从VS Code中以十六进制格式编辑文件。 笔记本UI更新 -改进的UX和撤消/重做支持。 远程开发教程 -学习在容器内和WSL中通过SSH开发。...我们还向选定的单元格添加了阴影轮廓,以使选择状态更加明显。 笔记本电脑热出口支持 我们在笔记本中添加了“热出口”支持,以允许扩展程序处理备份和还原。...现在,未保存的本地更改可以通过扩展序列化并在重新打开工作区时恢复。 撤消/重做增强 我们增加了对扩展的支持,以有助于撤消/重做堆栈。扩展现在可以控制哪些操作是不可撤消的。...例如,在GitHub问题笔记本中,您可以选择“ 锁定”按钮将单元格内容设置为只读,还可以通过常规的“撤消/重做”命令撤消/重做此操作。

    4.5K30

    WPF 弹出 popup 里面的 TextBox 无法输入汉字 修复在 Popup 输入法不跟随在 WinForms 弹出的 WPF 的 TextBox 无法输入问题

    古老的输入法就是通过判断获得焦点的句柄是支持输入和判断他需要什么输入,如果在 win7 的搜狗,就是这样判断,于是搜狗很难在 Popup 的 TextBox 输入文字。...Win32.SetFocus(GetHwnd(RenamePopup.Child)); } 在 WinForms 弹出的 WPF 的 TextBox 无法输入问题 刚刚 Siberia...问了我一个问题,为什么 WinForms 弹出的 WPF 的文本框无法输入数字,但是可以输入其他的内容 一开始我认为的是绑定的问题,如果一个控件绑定了另一个控件,或者有后台代码绑定,有另一个控件绑定了输入框都有方法让用户输入的数字不显示...,这时因为 WinForms 弹出的 WPF 程序消息循环的键盘事件的问题,对于中文的输入,有输入法在 HasKeyboardFocusCore 拿到输入,但是如果数字不经过输入法就在 WinForms...- 唐宋元明清2188 - 博客园 解决Winform中弹出WPF窗体不能在文本框中输入的问题 - 飞鹰的专栏 - CSDN博客 Windows 窗体和 WPF 互操作性输入 - 小而美 - CSDN

    2.5K20

    最新iOS设计规范六|10大交互规范(User Interaction)

    简要而准确地描述要撤消或重做的操作。撤消和重做警示框的标题自动包含前缀“撤消”或“重做”(包括尾随空格)。你需要提供一到两个词用于描述撤消或重做的内容,以显示在此前缀之后。...例如,你可以创建警报标题,例如“撤消名称”或“重做地址更改”。 当摇动手势用于呼出撤消和重做操作时,请不要将其用于其他操作。...如果你的APP确实需要专门的撤消和重做按钮,请使用系统提供的图标并将它们放在预期的位置,例如导航栏。 仅在当前上下文中执行撤消和重做操作。...“撤消”和“重做”应该仅对当前上下文产生明确而直接的影响,而不是更早的时候。...当您的应用在紧凑的环境中运行时,请确保工具选择器不会遮挡内容。 考虑提供自定义撤消和重做按钮,以便应用程序在紧凑环境中运行时显示。

    4.3K30

    浅谈RPA软件如何填写富文本框

    什么是富文本框?富文本框就是在网页上可以输入带格式的文本输入框。在富文本框中,可以设置使用不同的字体、颜色,可以控制段落、边距,还可以插入图片、表情等。是实现在线编辑不可或缺的工具。...在html表单控件里,并没有标准的富文本框控件,一般使用特定元素和css,js配合实现。...如下图所示,我们在富文本框中输入一个字符串,发现子页面的body元素内容与我们输入的字串保持一致。那么就可以通过直接改变子页面的body元素内容,也就把内容输入到富文本框了。...富文本框不承认填写内容首先,使用改变元素属性的方法填表时,如果网页很长,富文本框不可见,木头浏览器可以自动滚屏到富文本框处,更接近于真实的填表过程。其次,在填表步骤中,我们可以主动触发元素绑定的事件。...有一个简单的方法,模拟键盘操作填写富文本框,不需要分析元素绑定的事件,因为在键盘操作中,已触发真实填表过程的全部事件。

    41220

    .NET Core - 解决VS2019中.net core WinForms暂时无法使用Designer的临时方法

    具体的解决方法是在同一个 Solution下创建两个项目: 用于设计WinForms应用程序的.NET Framework应用程序(.net Framework 项目) 用于运行WinForms应用程序的...核心思想同样是借壳~ 在该方法中,只要添加新的Win Form或新的UserControl,就需要在Classic Framework WinForms项目(.net Framework的Win Forms...那是因为项目CoreHelloForm.Designer中的MainForm.cs 所Link 的与MainForm相关的文件已经在 项目CoreHelloForm 中 打开。...比如,我做了如下几处修改: 改掉 Form的 Title ? 改掉文本框的内容. ? 改掉窗体的图标(icon) ? 按F5,运行的效果图为: ?...项目代码已推到github,欢迎Fork和star. 传送门: .netCore-WinForms_Designer , 如果觉得自己配置起来麻烦,也可以 clone 下来自己体验一把喔~

    2.2K30

    桌面编辑器ONLYOFFICE 功能多样性快来试试吧!

    使用场景 企业办公:适合需要高效办公和团队协作的企业用户。 教育机构:支持教学和研究文档的创建与共享。 个人用户:提供强大的文档编辑工具,满足日常文档处理需求。...1.PDF编辑器 编辑文本、添加/旋转/删除页面 插入修改各种对象,如表格、形状、文本框、图像、 艺术字、超链接、方程式等 添加文本注释和标注 切换编辑或查看模式 创建PDF模板、添加交互式字段、调整属性并保存为...增加塞尔维亚语(西里尔语和拉丁语)本地化选项 电子表格编辑器中新增孟加拉语和僧伽罗语 6.媒体播放器 ·在演示文稿中播放视频和音频文件 ·媒体播放器可在单独的面板中打开,流畅播放 7、其他新功能...设置所需的页面颜色并自定义文档中的编号格式 在电子表格中增加GETPIVOTDATA和 IMPORTRANGE函数 为插入的形状应用阴影并调整其属性 更丰富的配色方案 隐藏或显示编辑器标题栏中的“保存...”、“打印”、“撤消和“重做”按钮等 8.下载 提供deb、rpm、exe和dmg包,适用于Windows、.Linux和macOS Snap、Flatpak和Applmage将陆续推出 ·立即下载ONLYOFF1CE

    17210

    100 条 Linux vim 命令备忘单,收藏起来随时备用!

    强行写入当前文件并退出 插入命令备忘单 a 在光标后插入 A 在行尾插入 i 在光标前插入 I 在行中的第一个非空白之前插入 gI 在第 1 列中插入 o 在光标下方开始新行并插入 O 在光标上方开始新行并插入...剪切、复制和粘贴命令备忘单 yy复制(猛拉)整行 #yy复制指定行数 dd剪切(删除)整行 #dd剪切指定的行数 p粘贴在光标后 P粘贴在光标前 删除命令备忘单 d删除突出显示的文本 dd删除一行文本...Ctrl+ r重做 .重复上一个命令 移动命令备忘单 h向左移动光标 j向下移动光标 k向上移动光标 l向右移动光标 b移动到单词的开头 w移动到下一个单词的开头 e移动到单词的末尾 0跳到行首 $...:%s/search/replace/gc 用确认替换替换每次出现的搜索 撤消和重做命令备忘单 u 撤消上次更改 Ctrl+r 重做已撤消的更改 标签命令备忘单 :tabe 在新选项卡中打开文件...command在 shell 中运行“命令”并显示 STDOUT !! command在 shell 中运行“命令”并将 STDOUT 粘贴到文件中 总结 vim用的好,文本编辑一大跑!

    1.5K20
    领券