1

我用一个文本框制作了一个表单,它接受一个单词并搜索一堆句子以查看其中是否包含该单词。之后我必须出现这些句子并突出显示该单词。我的计划是制作一个 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);
        }
    }

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

编辑2

我最终这样做的方式是制作两个单独的组件,以组合我的选择。一个是ListBox所有句子都是彩色的,并且可以选择其中一个,另一个是RichBox带有单独彩色单词的选项,因为使用 the 很难实现这一点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

4 回答 4

1

在 Windows 窗体中没有执行此操作的标准方法。您必须手动呈现列表项(创建所有者绘制的列表框)。在 WPF 中,这将是一件容易的事。

编辑
只用不同的字体绘制字符串的一部分并不是一件容易的事。我要尝试的是以下内容:

引入告诉您“粗体开始”和“粗体结束”的标记 - 有点像 HTML。让我们将它们称为与 HTML 中相同的名称。所以你的字符串可能看起来像这样:

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

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

Hello, I am
bold
text
!

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

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

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

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

你好,我是
你好,我是粗体你好
,我是粗体你好
,我是粗体!

于 2012-05-31T12:58:27.993 回答
0

基于@Thorsten Dittmar 的回答,我几乎完全开发了您在单个列表框中寻找的内容。您可以在https://advancedlistbox.codeplex.com/找到它。

于 2013-03-12T18:38:54.733 回答
0

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

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

于 2012-05-31T12:53:21.837 回答
0

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

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

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

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

编辑1:

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

于 2012-05-31T15:25:34.440 回答