Как мне изменить цвет слова внутри списка

Я создал форму с TextBox, которая принимает слово и ищет в нем несколько предложений, чтобы увидеть, содержит ли это слово какое-либо из них. После этого мне нужно отобразить эти предложения и выделить слово. Мой план - создать ListBox и добавить предложения внутри него. Моя проблема в том, как выделить слово (я полагаю, изменив цвет), чтобы его можно было различить.

Есть ли предпочтительный способ? Я выбрал ListBox, чтобы выбрать искомое предложение.

Edit

В соответствии с инструкциями @Thorsten Dittmar a создайте нарисованный владельцем список.

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] + " ");
  }
}
 Louis Kottmann31 мая 2012 г., 14:51
Мы говорим о winforms? просто убеждаюсь.
 Thorsten Dittmar01 июн. 2012 г., 08:50
Я отредактировал свой ответ, чтобы описать алгоритм, который можно использовать для отображения элементов списка так, как вы хотите.
 giannis christofakis31 мая 2012 г., 14:55
@BaboonWindow System Form
 Youenn Bouglouan31 мая 2012 г., 16:49
Возможно, вы захотите взглянуть наthis.
 giannis christofakis31 мая 2012 г., 17:08
@YouennBouglouan Извините, вы не можете найти способ выделить только частьList Item.

Ответы на вопрос(4)

Giannosfor, в ответ на ваш комментарий вам нужно будет использовать параметр e обработчика событий, чтобы выбрать, какой элемент вы хотите выделить (ссылка здесь).

Посмотрите на ответ от Shadow Wizard и, в частности, на использование e.Index.

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

Переменная g представляет графическую часть вашего текущего элемента e. Метод FillRectangle позволяет изменять цвет фона элемента.

Edit 1:

Я попытался сделать, как вы говорите в комментарии ниже, но кажется, что нет способа выделить только часть строки, используя ListBox. Мне кажется, что единственный элемент управления, который может поддерживать это RichTextBox. Решением может быть реализация вашего собственного пользовательского элемента управления в форме списка RichTextBoxes.

 01 июн. 2012 г., 08:47
Я отредактировал свой ответ, чтобы дать вам представление о том, как это можно сделать.
 giannis christofakis31 мая 2012 г., 18:50
Моя проблема именно в том, как определить конкретную графическую часть (я имею в виду в коде) текущего элементаe чтобы поменять фон? Если мой текущий элемент - "Собака" я хочу подчеркнуть, что это нравитсяDog& Quot; не все предложение. Если вы можете мне помочь, я буду признателен.

Не существует стандартного способа сделать это в Windows Forms. Вы должны визуализировать элементы списка вручную (создать список, нарисованный владельцем). В WPF это было бы легкой задачей.

EDIT
Рисование только части строки другим шрифтом - задача не из легких. Я попробую следующее:

Введите токены, которые сообщают вам «жирный старт» и "полужирный конец"; - немного похоже на HTML. Давайте назовем их так же, как в HTML. Таким образом, ваша строка может выглядеть так:

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

Теперь я делю свою строку на текст, который не выделен жирным шрифтом, и текст, который выделен жирным шрифтом. Я получил следующие части:

Hello, I am
bold
text
!

Теперь я рисую каждую часть, используя следующий алгоритм:

Draw string in current format at current position x increase position x by width of the string drawn in step 1 change formatting according to upcoming string goto 1

На шаге 2Graphics.MeasureString метод будет вызван, чтобы получить ширину строки.

Выполнение этого для 4 приведенных выше примеров приведет к:

Привет, я
Привет, яbold
Привет, яbold текст
Привет, яbold текст!

 giannis christofakis31 мая 2012 г., 15:18
Ну, это хорошая идея, я должен попробовать.
 31 мая 2012 г., 15:14
Что ж, поскольку вы сами рисуете текст и фон, вы наверняка найдете решение, которое выделит одно слово жирным шрифтом или изменит фон. Но даже когда вы рисуете отдельные элементы списка самостоятельно, для этого нет встроенного решения.
 giannis christofakis31 мая 2012 г., 15:04
Если я создаю нарисованный владельцем ListBox, могу ли я выделить отдельное слово ListItem, а не все?

У простого TextBox может быть установлено свойство Foreground, но оно применяется ко всему тексту в TextBox.

Если вы хотите, чтобы определенные слова были «выделены», вам нужно либо разделить предложение на несколько текстовых полей (грязное), либо использоватьRichTextBox

 31 мая 2012 г., 15:32
@ThorstenDittmar он может настроить ListBoxItem для использования RichTextBox.
 31 мая 2012 г., 15:43
stackoverflow.com/questions/8156141/c-sharp-custom-listbox-gui сводится к следующему: наследовать ListBox и переопределять OnDrawItem.
 31 мая 2012 г., 15:36
Как это должно быть возможно?
 31 мая 2012 г., 14:58
Он не хочет выделять слово в текстовом поле, но, как он сказал, в окне списка.
 giannis christofakis31 мая 2012 г., 15:13
Да, вы правы, но если есть предпочтительный способ или альтернатива, я бы хотел это знать.

Основываясь на ответе @Thorsten Dittmar, я разработал в точности то, что вы ищете, в одном ListBox. Вы можете найти его наhttps://advancedlistbox.codeplex.com/.

Ваш ответ на вопрос