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

时间:2012-05-31 12:46:19

标签: c# .net winforms colors listbox

我创建了一个带有TextBox的表单,它接受一个单词并搜索一堆句子,看看是否有任何单词包含该单词。之后我必须出现那些句子并突出显示单词。我的计划是创建一个ListBox并在其中添加句子。我的问题是如何突出显示这个词(通过改变我想的颜色),这样可以区分它。

有更好的方法吗? 我选择了ListBox,所以我可以选择我正在寻找的句子。

修改

根据@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);
        }
    }

如何分割句子以便只画一个单词?

EDIT2

我最终做的方法是制作两个单独的组件,以便完善我的选择。 一个是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] + " ");
  }
}

4 个答案:

答案 0 :(得分:1)

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

修改
仅绘制不同字体的字符串的一部分并非易事。我尝试的是以下内容:

介绍告诉你“大胆开始”和“大胆结束”的标记 - 有点像HTML。我们称它们与HTML中的相同。所以你的字符串看起来像这样:

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

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

Hello, I am
bold
text
!

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

  1. 以当前格式在当前位置x
  2. 绘制字符串
  3. 根据步骤1中绘制的字符串的宽度增加位置x
  4. 根据即将发布的字符串
  5. 更改格式
  6. 转到1
  7. 在第2步中,将调用Graphics.MeasureString方法来获取字符串的宽度。

    对上述4个样本部分执行此操作将导致:

    您好,我是 您好,我大胆
    您好,我是粗体文字
    您好,我粗体文字

答案 1 :(得分:0)

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

如果您希望“突出显示”特定单词,则需要将句子拆分为多个TextBox(脏),或者使用RichTextBox

答案 2 :(得分:0)

Giannosfor,为了回应您的评论,您必须使用事件处理程序的参数e来选择要高亮显示的项目(link here)。

查看Shadow Wizard的响应,特别是使用e.Index。

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

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

修改1:

我尝试按照您在下面的评论中所说的那样做,但似乎没有办法只使用ListBox高亮显示字符串的一部分。对我而言,似乎唯一能够支持RichTextBox的控件。解决方案可能是以RichTextBoxes列表的形式实现您自己的用户控件。

答案 3 :(得分:0)

在@Thorsten Dittmar回答的基础上,我在一个ListBox中开发了你正在寻找的东西。您可以在https://advancedlistbox.codeplex.com/找到它。