当用户正在编写时,如何在 RichTextBox 中使用不同的颜色为不同的单词着色,并在单击该彩色文本时引发事件

2023-11-25

当用户在富文本框中写入一些单词时,如果该单词与某个特定单词匹配,则该单词的颜色应该自动更改。

当用户单击特定的彩色文本时,它应该引发一个事件。


鉴于要求:

1)用户在 RichTextBox 控件中插入一些文本。
2)如果输入的单词是预定义单词列表的一部分,则该单词应该改变颜色(因此,定义单词和颜色之间的关系)。
3)当在彩色单词上生成鼠标单击事件时,会引发一个事件,以通知单击了哪个单词。

可能的结果(复制视觉示例中的内容):

RicheTextBox write words in Colors

使用自定义 EventArgs 定义自定义 EventHandler:

public class WordsEventArgs : EventArgs
{
    private string m_word;
    public WordsEventArgs(string word) { m_word = word; }
    public string Word { get { return m_word; } set { m_word = value; } }
}

public delegate void WordsEventHandler(object sender, WordsEventArgs e);
public event WordsEventHandler WordClicked;

protected void OnWordClicked(WordsEventArgs e) => WordClicked?.Invoke(this, e);

订阅活动:

this.WordClicked += new WordsEventHandler(this.Word_Click);

单词列表的简单类:

public class ColoredWord
{
    public string Word { get; set; }
    public Color WordColor { get; set; }
}

public List<ColoredWord> ColoredWords = new List<ColoredWord>();

用一些相关颜色的单词填充列表,然后将其绑定到 ListBox,调用FillColoredWords()方法(换句话说,处理将文本片段与颜色值相关联的对象集合):

public void FillColoredWords()
{
    ColoredWords.Add(new ColoredWord { Word = "SIMPLE", WordColor = Color.Goldenrod });
    ColoredWords.Add(new ColoredWord { Word = "COLORED", WordColor = Color.Salmon });
    ColoredWords.Add(new ColoredWord { Word = "TEXT", WordColor = Color.DarkCyan });
    this.listBox1.DisplayMember = "Word";
    this.listBox1.DataSource = ColoredWords;
}

In the KeyPress事件,评估最后输入的单词是否是要着色的单词列表的一部分:

private void richTextBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    int currentPosition = richTextBox1.SelectionStart;

    if (e.KeyChar == (char)Keys.Space && currentPosition > 0 && richTextBox1.Text.Length > 1) {
        int lastSpacePos = richTextBox1.Text.LastIndexOf((char)Keys.Space, currentPosition - 1);
        lastSpacePos = lastSpacePos > -1 ? lastSpacePos + 1 : 0;

        string lastWord = richTextBox1.Text.Substring(lastSpacePos, currentPosition - (lastSpacePos));
        ColoredWord result = ColoredWords.FirstOrDefault(s => s.Word == lastWord.ToUpper());

        richTextBox1.Select(lastSpacePos, currentPosition - lastSpacePos);
        if (result != null) {
            if (richTextBox1.SelectionColor != result.WordColor) { 
                richTextBox1.SelectionColor = result.WordColor;
            }
        }
        else {
            if (richTextBox1.SelectionColor != richTextBox1.ForeColor) { 
                richTextBox1.SelectionColor = richTextBox1.ForeColor;
            }
        }
        richTextBox1.SelectionStart = currentPosition;
        richTextBox1.SelectionLength = 0;
        richTextBox1.SelectionColor = richTextBox1.ForeColor;
    }
}

In the MouseClick事件,验证事件是否是在彩色单词上生成的。
在这种情况下,请提高习惯OnWordClicked() event:

private void richTextBox1_MouseClick(object sender, MouseEventArgs e)
{
    if (richTextBox1.SelectionColor.ToArgb() != richTextBox1.ForeColor.ToArgb()) {
        try {
            int wordInit = richTextBox1.Text.LastIndexOf((char)32, richTextBox1.SelectionStart);
            wordInit = wordInit > -1 ? wordInit : 0;
            int wordEnd = richTextBox1.Text.IndexOf((char)32, richTextBox1.SelectionStart);
            string wordClicked = richTextBox1.Text.Substring(wordInit, wordEnd - wordInit) + Environment.NewLine;
            OnWordClicked(new WordsEventArgs(wordClicked));
        }
        catch (Exception) {
            //Handle a fast DoubleClick: RTB is a bit dumb.
            //Handle a word auto-selection that changes the `.SelectionStart` value
        }
    }
}

在自定义事件中,您可以将单击的单词附加到文本框(或执行您想要对其执行的任何其他操作):

private void Word_Click(object sender, WordsEventArgs e)
{
    textBox1.AppendText(e.Word);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当用户正在编写时,如何在 RichTextBox 中使用不同的颜色为不同的单词着色,并在单击该彩色文本时引发事件 的相关文章

  • 错误:表达式不产生值

    我尝试将以下 C 代码转换为 VB NET 但在编译代码时出现 表达式不产生值 错误 C Code return Fluently Configure Mappings m gt m FluentMappings AddFromAssemb
  • 如何在加载.NET WinForm应用程序user.config文件时捕获异常?

    有时 在使用默认配置系统的 NET 2 0 WinForm 桌面应用程序中 user config文件将被损坏并且无法再加载 当配置系统尝试加载它时 它会抛出一个System Xml XmlException 抛开 为什么文件首先被损坏 的
  • 在 C 中匹配二进制模式

    我目前正在开发一个 C 程序 需要解析一些定制的数据结构 幸运的是我知道它们是如何构造的 但是我不确定如何在 C 中实现我的解析器 每个结构的长度都是 32 位 并且每个结构都可以通过其二进制签名来识别 举个例子 有两个我感兴趣的特定结构
  • 单个对象的 Monogame XNA 变换矩阵?

    我读过一些解释 XNA Monogame 变换矩阵的教程 问题是这些矩阵应用于 SpriteBatch Begin matrix 这意味着所有 Draw 代码都将被转换 如何将变换矩阵应用于单个可绘制对象 就我而言 我想转换滚动背景 使其自
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • 将 Word 文档另存为图像

    我正在使用下面的代码将 Word 文档转换为图像文件 但是图片显得太大 内容不适合 有没有办法渲染图片或将图片保存到合适的尺寸 private void btnConvert Click object sender EventArgs e
  • 为什么调用非 const 成员函数而不是 const 成员函数?

    为了我的目的 我尝试包装一些类似于 Qt 共享数据指针的东西 经过测试 我发现当应该调用 const 函数时 会选择它的非 const 版本 我正在使用 C 0x 选项进行编译 这是一个最小的代码 struct Data int x con
  • 是否有实用的理由使用“if (0 == p)”而不是“if (!p)”?

    我倾向于使用逻辑非运算符来编写 if 语句 if p some code 我周围的一些人倾向于使用显式比较 因此代码如下所示 if FOO p some code 其中 FOO 是其中之一false FALSE 0 0 0 NULL etc
  • 标准化 UTF-8 到底是什么?

    The 重症监护室项目 http userguide icu project org transforms normalization 现在也有一个PHP库 http us php net manual en class normalize
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的
  • C#:帮助理解 UML 类图中的 <>

    我目前正在做一个项目 我们必须从 UML 图编写代码 我了解 UML 类图的剖析 但我无法理解什么 lt
  • C# HashSet 只读解决方法

    这是示例代码 static class Store private static List
  • 如果我使用客户端计算机上未安装的字体,会发生什么情况?

    有人可以告诉我 如果我在 WinForms 应用程序中使用目标计算机上不可用的字体 会发生什么情况 它是否使用同一系列的字体 只是 Sans Serif 还是其他字体 您的应用程序将回退到 Segoe UI Tahoma 然后是 MS Sa
  • 使用 C# 读取 Soap 消息

  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • 从 Excel 应用程序对象中查找位数(32 位/64 位)?

    是否可以从 Microsoft Office Interop Excel ApplicationClass 确定 Excel 是以 32 位还是 64 位运行 Edit该解决方案应该适用于 Excel 2010 和 Excel 2007 此
  • 如何部署“SQL Server Express + EF”应用程序

    这是我第一次部署使用 SQL Server Express 数据库的应用程序 我首先使用实体 框架模型来联系数据库 我使用 Install Shield 创建了一个安装向导来安装应用程序 这些是我在目标计算机中安装应用程序所执行的步骤 安装
  • WebSocket安全连接自签名证书

    目标是一个与用户电脑上安装的 C 应用程序交换信息的 Web 应用程序 客户端应用程序是 websocket 服务器 浏览器是 websocket 客户端 最后 用户浏览器中的 websocket 客户端通过 Angular 持久创建 并且
  • 使用 .NET Process.Start 运行时挂起进程 - 出了什么问题?

    我在 svn exe 周围编写了一个快速而肮脏的包装器来检索一些内容并对其执行某些操作 但对于某些输入 它偶尔会重复挂起并且无法完成 例如 一个调用是 svn list svn list http myserver 84 svn Docum

随机推荐

  • JPA 工作单元克隆中遇到空或零主键

    我了解到JPA并有任务创建数据库并向其中插入一些值 我想知道如何找出最近插入的对象的ID是什么 所以我找到了一种我需要使用的方法flush的方法EntityManager 不幸的是我得到了 工作单元克隆中遇到空或零主键 当我使用上述方法时出
  • 如何检查 NSNumber 中的空值

    首先我承认我的无知 在我从事项目的几个月里 我已经学到了关于 Objective C 的一切 我还发现 Objective C 似乎使我使用过的任何其他语言中的简单问题变得复杂 这非常令人沮丧 这个问题就是一个例子 在第一次运行中 我的应用
  • 在 Android Lollipop 上使用 NFC 激活设备所有者

    我正在尝试使用 NFC 在设备上设置设备所有者包 Lollipop 概述中提到了here 要部署并激活设备所有者 您必须执行 NFC 数据 当设备处于运行状态时从编程应用程序传输到设备 其未配置状态 此数据传输发送相同的信息 如托管配置中描
  • 如何从完整的文件名列表中删除文件扩展名?

    我正在使用以下命令来获取包含名为的目录中的所有文件的列表tokens import os accounts next os walk tokens 2 Output gt gt gt print accounts DS Store Amie
  • MFC 应用程序到 Unicode/MBCS 的分段转换

    我有一个大型 MFC 应用程序 我正在扩展它以允许多语言输入 目前 我需要允许用户在单个对话框的编辑框中输入 Unicode 数据 有没有办法在不为整个应用程序打开 UNICODE 或 MBCS 的情况下执行此操作 我目前只需要转换应用程序
  • 使用 myclass::operator<(myclass &other) 对 std::list 进行排序

    我有一个std list
  • Xcode 4:使用 Git 存储库提交版本在每个构建上更新 CFBundleVersion

    我将 Xcode 4 与 Git 结合使用 并希望在每次构建时增加 Info plist 中的 CFBundleVersion CFBundleVersion 键的值应更新为我对 Git 存储库所做的最后一次提交的编号 I found th
  • 从函数内部获取所有函数参数的列表

    有没有办法得到all函数内部的函数参数 match call 不返回设置了默认值但未被覆盖的参数 例如 xf lt function a b Hi c TRUE print as list match call expand dots FA
  • 公开 dll 以进行 COM 互操作

    我以为我知道如何做到这一点 但显然不知道 所以我希望得到一些帮助 我无法让我的 dll 注册 因此我无法在 VBS 或其他地方实例化它 我编写了以下示例类 选中 使程序集 COM 可见 选中 注册 COM 互操作 然后构建它 当我尝试从 V
  • 不使用媒体播放器播放视频 [Winform]

    我想像那个人一样播放视频 link 我正在开发 C Windows 窗体应用程序 不是 NXA 但我不知道怎么办 我尝试使用Microsoft DirectX AudioVideoPlayback但没有运气 这是我到目前为止所尝试的 Ope
  • Spring Boot 仅在单元测试中返回错误的状态代码

    我正在使用 Spring Boot 开发 REST API 我有一个控制器来创建一个新用户 当创建用户时它会响应 201 CREATED 响应没有正文内容 使用 Postman 或任何浏览器 我收到 201 响应 但是当我尝试使用单元测试
  • 如何将 Visual Studio Code 终端输出设置为英语

    我的环境是 Visual Studio 代码 英语 Windows 10 日语 当我尝试使用终端添加包时 它以日语输出消息 但我希望它能用英语输出它们 我已经找到了解决方案 由于终端使用PowerShell 因此我们应该设置powershe
  • 将图像分割成更小的图像的算法,减少空白量并指定最大矩形量

    我正在寻找一种算法 可以将图像分割成更小的图像 但有一些限制 一个限制是使用最少量的 空白 即空像素 另一个是指定将其分割成的最大图像数量 例如 让我们看一下下图 其中有很多 空白 我想将此图像分成几个其他图像 这样我就可以减少该图像占用的
  • 如何在Android中播放歌曲-phonegap [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 目前不接受答案 一个月前 我开始使用phonegap html5 css3 和jQtouch 我正在开发一个应用程序 我需要在该应用程序中播放声音 我对这项任务有一个严重的问题 首先 我发现
  • asp.net sessionID 在回发时发生变化?

    我正在编写一个在缓存中存储对象的 ASP NET 应用程序 当页面第一次加载时 它会检查缓存中是否有该对象 如果存在 它将使用该对象 如果该对象不存在 它将重新构建它并将其存储在缓存中 由于多个用户可以同时使用此应用程序 因此我尝试将对象存
  • 未对齐的内存访问:是否定义了行为? [复制]

    这个问题在这里已经有答案了 考虑以下代码 include
  • 对“REST”一词及其含义的误解是什么[关闭]

    Closed 这个问题是基于意见的 目前不接受答案 弄清楚什么是真正的 RESTful 应用程序和 或 api 并不总是那么容易 因为对 REpresentational State Transfer 架构风格的含义和范围存在某种误解 最初
  • 计算 MKMapView 中 MKPolygon 的面积

    我只是不知道如何计算 MKMapView 上的面积 有谁解决过这个问题吗 这是我的代码 但它返回太多 func ringArea gt Double var area Double 0 if templocations count gt 2
  • Strapi 路线返回 404 未找到

    我遇到一个问题 API 中的所有路由都返回404 Not found 我跟着从 Docker Hub 拉取部分位于Strapi strapi docker 除了运行图像之外 我所做的是创建一个名为的新内容类型post包含三个字段 如果我尝试
  • 当用户正在编写时,如何在 RichTextBox 中使用不同的颜色为不同的单词着色,并在单击该彩色文本时引发事件

    当用户在富文本框中写入一些单词时 如果该单词与某个特定单词匹配 则该单词的颜色应该自动更改 当用户单击特定的彩色文本时 它应该引发一个事件 鉴于要求 1 用户在 RichTextBox 控件中插入一些文本 2 如果输入的单词是预定义单词列表