You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C# WinForms中如何为Textbox内的特定单词单独设置指定颜色

标准WinForms的TextBox控件不支持单字/单词独立设置颜色,它的ForeColor属性只能全局修改所有文本的颜色,要实现你要的输入过程中特定单词自动上色的效果,直接使用同属WinForms原生控件的RichTextBox即可,不需要引入第三方组件,实现成本极低。

核心实现思路
  • 将界面上原来的TextBox替换为RichTextBox,该控件原生支持为任意选中的文本片段单独设置字体颜色、样式,是实现富文本输入高亮的最优选择
  • 监听RichTextBox的TextChanged事件,每次用户输入导致文本变化时,执行关键词匹配上色逻辑
  • 上色操作前先记录当前光标位置,操作完成后恢复光标位置,避免上色后光标自动跳转到文本开头,影响输入体验
  • 上色前临时挂起控件绘制,避免逐段改色时出现界面闪烁
完整实现代码

你只需要在窗体中拖入一个RichTextBox控件(命名默认richTextBox1即可),在窗体代码中添加如下逻辑:

// 配置需要高亮的关键词和对应颜色
private readonly Dictionary<string, Color> _keywordColorDict = new Dictionary<string, Color>
{
    ["Hello"] = Color.Yellow,
    ["GoodBoy"] = Color.Red
};

private void richTextBox1_TextChanged(object sender, EventArgs e)
{
    // 暂存当前光标位置,防止上色后光标跳转
    int cursorPos = richTextBox1.SelectionStart;
    int cursorLen = richTextBox1.SelectionLength;

    richTextBox1.SuspendLayout();
    // 先将全文本重置为默认黑色,清除旧的高亮残留
    richTextBox1.SelectAll();
    richTextBox1.SelectionColor = Color.Black;

    string allText = richTextBox1.Text;
    // 遍历所有关键词匹配上色
    foreach (var keyword in _keywordColorDict.Keys)
    {
        int searchStart = 0;
        while (searchStart < allText.Length)
        {
            // 查找关键词位置
            int matchIndex = allText.IndexOf(keyword, searchStart, StringComparison.Ordinal);
            if (matchIndex == -1) break;

            // 选中匹配到的关键词,设置对应颜色
            richTextBox1.Select(matchIndex, keyword.Length);
            richTextBox1.SelectionColor = _keywordColorDict[keyword];

            // 从当前匹配位置后继续查找下一个匹配项
            searchStart = matchIndex + keyword.Length;
        }
    }

    // 恢复光标位置,恢复绘制
    richTextBox1.Select(cursorPos, cursorLen);
    richTextBox1.ResumeLayout();
}

记得在窗体构造函数中绑定事件,或者直接在设计器的事件面板中双击TextChanged事件自动生成绑定:

public Form1()
{
    InitializeComponent();
    richTextBox1.TextChanged += richTextBox1_TextChanged;
}
优化提示
  • 如果需要忽略大小写匹配关键词,把IndexOf方法的StringComparison.Ordinal参数替换为StringComparison.OrdinalIgnoreCase即可
  • 如果不想匹配长单词中内嵌的关键词(比如不希望"Hello123"中的"Hello"被高亮),可以改用正则匹配,给关键词加上\b单词边界限定符
  • 不要尝试通过重写标准TextBox的Paint事件自绘实现该效果:标准TextBox是Windows系统封装的原生控件,自绘逻辑兼容性极差,很容易出现输入卡顿、文本错位、光标显示异常的问题,后续维护成本极高

内容的提问来源于stack exchange,提问作者Technika číslo 1 s.r.o

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 18:27:25