我创建了一个带有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] + " ");
}
}
答案 0 :(得分:1)
在Windows窗体中没有标准的方法。您必须手动呈现列表项(创建所有者绘制的列表框)。在WPF中,这将是一项简单的任务。
修改强>
仅绘制不同字体的字符串的一部分并非易事。我尝试的是以下内容:
介绍告诉你“大胆开始”和“大胆结束”的标记 - 有点像HTML。我们称它们与HTML中的相同。所以你的字符串看起来像这样:
Hello, I am <b>bold</b> text<b>!</b>
现在我将我的字符串标记为非粗体文本和粗体文本。我会得到以下部分:
Hello, I am
bold
text
!
现在我使用以下算法绘制每个部分:
在第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/找到它。