如何更改列表框中单词的颜色
我创建了一个带有TextBox的表单,它接受一个单词并搜索一堆句子,看看是否有任何单词包含该单词。之后我必须出现那些句子并突出显示单词。我的计划是创建一个ListBox并添加里面的句子。 我的问题是如何突出这个词(通过改变我想的颜色),以便可以区分。
有更好的方法吗? 我选择了ListBox,所以我可以选择我正在寻找的句子。
编辑
根据@Thorsten Dittmar的指示,创建一个所有者绘制的列表框。
public partial class Form1 : Form { private List _items; public Form1() { InitializeComponent(); _items = new List(); _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] + " "); } }
在Windows窗体中没有标准的方法。 您必须手动呈现列表项(创建所有者绘制的列表框)。 在WPF中,这将是一项简单的任务。
编辑
仅绘制不同字体的字符串的一部分并不是一件容易的事。 我要尝试的是以下内容:
引入告诉你“大胆开始”和“大胆结束”的标记 – 有点像HTML。 我们称它们与HTML中的相同。 所以你的字符串看起来像这样:
Hello, I am bold text!
现在我将我的字符串标记为非粗体文本和粗体文本。 我会得到以下部分:
Hello, I am bold text !
现在我使用以下算法绘制每个部分:
- 在当前位置x以当前格式绘制字符串
- 在步骤1中绘制的字符串的宽度增加位置x
- 根据即将到来的字符串更改格式
- 转到1
在第2步中,将调用Graphics.MeasureString
方法以获取字符串的宽度。
对上述4个样本部分执行此操作将导致:
你好,我是
你好,我很大胆
你好,我是粗体文字
你好,我是大胆的文字!
一个简单的TextBox可以设置其Foreground属性,但它适用于TextBox中的整个文本。
如果您希望特定单词“突出显示”,您需要将句子拆分为多个TextBox(脏),或者使用RichTextBox
Giannosfor,为了回应你的评论,你必须使用事件处理程序的参数e来选择你想要高亮的项目( 链接在这里 )。
查看Shadow Wizard的响应,特别是使用e.Index。
Graphics g = e.Graphics; ... g.FillRectangle(new SolidBrush(color), e.Bounds);
变量g代表当前项目e的图形部分。 方法FillRectangle允许您更改项目背景的颜色。
编辑1:
我试着像你在下面的评论中所说的那样做,但似乎没有办法只使用ListBox高亮显示字符串的一部分。 对我而言,似乎唯一能够支持RichTextBox的控件。 解决方案可能是以RichTextBoxes列表的forms实现您自己的用户控件。
在@Thorsten Dittmar回答的基础上,我在一个ListBox中开发了你正在寻找的东西。 您可以在https://advancedlistbox.codeplex.com/找到它。