如何更改列表框中单词的颜色

本文关键字:单词 颜色 何更改 列表 | 更新日期: 2023-09-27 18:35:48

我用一个文本框制作了一个表单,它接受一个单词并搜索一堆句子,看看它们中是否有任何包含该单词。之后,我必须出现这些句子并突出显示单词.我的计划是制作一个列表框并在其中添加句子。我的问题是如何突出显示单词(通过更改我想的颜色)以便可以区分它。

有没有更好的方法?我选择了列表框,以便可以选择我要查找的句子。

编辑

根据@Thorsten Dittmar的指示,创建一个所有者绘制的列表框。

public partial class Form1 : Form
    {
        private List<string> _items;
        public Form1()
        {
            InitializeComponent();
            _items = new List<string>();
            _items.Add("One");
            _items.Add("Two");
            _items.Add("Three");
            listBox1.DataSource = _items;
        }
        private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
        {
            e.DrawBackground();
            e.DrawFocusRectangle();
            e.Graphics.DrawString(_items[e.Index],
                new Font(FontFamily.GenericSansSerif,
                    8, FontStyle.Bold),
                    new SolidBrush(Color.Red), e.Bounds);
        }
    }

我将如何拆分句子以只画一个单词?

编辑2

我最终做到的方法是制作两个独立的组件,以组合我的选择。一个是ListBox,所有句子都涂了颜色,可以选择一个那些和另一个一个RichBox与单独的彩色词,因为是困难的通过ListBox实现这一目标(至少对我来说)。

我实现这一点的方法是使用一个布尔数组来指出哪个单词应该每句话都有颜色。

for (int i = 0; i < words.Length; i++)
{
  if (segments[i]) //<-boolean array
  {
     rich.SelectionColor = Color.Red;
     rich.AppendText(words[i] + " ");
     rich.SelectionColor = Color.Black;
  }
  else
  {
    rich.AppendText(words[i] + " ");
  }
}

如何更改列表框中单词的颜色

在 Windows 窗体中没有标准的方法。您必须手动呈现列表项(创建所有者绘制的列表框)。在 WPF 中,这将是一项简单的任务。

编辑
仅以不同的字体绘制字符串的一部分并非易事。我会尝试如下:

引入告诉您"粗体开始"和"粗体结束"的令牌 - 有点像在 HTML 中。让我们像在HTML中一样称呼它们。所以你的字符串可能看起来像这样:

Hello, I am <b>bold</b> text<b>!</b>

现在,我将字符串标记为非粗体文本和粗体文本。我会得到以下部分:

Hello, I am
bold
text
!

现在,我将使用以下算法绘制每个部分:

  1. 在当前位置 x 处以当前格式绘制字符串
  2. 按步骤 1 中绘制的字符串的宽度增加位置 x
  3. 根据即将到来的字符串更改格式
  4. 转到 1

在步骤 2 中,将调用 Graphics.MeasureString 方法来获取字符串的宽度。

对上述 4 个示例部件执行此操作将导致:

你好,我是
你好,我很大胆
您好,我是体文字
您好,我是体文字

一个简单的文本框可以设置其前景属性,但它适用于文本框中的整个文本。

如果您希望"突出显示"特定单词,则需要将句子拆分为多个文本框(脏),或者使用富文本框

Giannosfor,为了响应您的评论,您必须使用事件处理程序的参数 e 来选择要突出显示的项目(链接在此处)。

查看 Shadow Wizard 的响应,尤其是 e.Index 的使用。

Graphics g = e.Graphics;
...
g.FillRectangle(new SolidBrush(color), e.Bounds);

变量 g 表示当前项目的图形部分 e. 方法 FillRectangle 允许您更改项目背景的颜色。

编辑 1:

我试图按照您在下面的评论中所说的去做,但似乎无法使用 ListBox 仅突出显示字符串的一部分。对我来说,似乎唯一能够支持的控件是RichTextBox。解决方案可能是以富文本框列表的形式实现您自己的用户控件。

基于@Thorsten Dittmar 答案,我几乎完全理解了您在单个 ListBox 中寻找的内容。您可以在 https://advancedlistbox.codeplex.com/找到它。