Вопрос по c#, colors, .net – Как мне изменить цвет слова внутри списка

1

Я создал форму с 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] + " ");
  }
}
Возможно, вы захотите взглянуть наthis. Youenn Bouglouan
Я отредактировал свой ответ, чтобы описать алгоритм, который можно использовать для отображения элементов списка так, как вы хотите. Thorsten Dittmar
@BaboonWindow System Form giannis christofakis
Мы говорим о winforms? просто убеждаюсь. Louis Kottmann
@YouennBouglouan Извините, вы не можете найти способ выделить только частьList Item. giannis christofakis

Ваш Ответ

4   ответа
0

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

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

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

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.

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

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

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

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

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

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

Hello, I am
bold
text
!

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

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

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

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

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

Если я создаю нарисованный владельцем ListBox, могу ли я выделить отдельное слово ListItem, а не все? giannis christofakis
Ну, это хорошая идея, я должен попробовать. giannis christofakis
Что ж, поскольку вы сами рисуете текст и фон, вы наверняка найдете решение, которое выделит одно слово жирным шрифтом или изменит фон. Но даже когда вы рисуете отдельные элементы списка самостоятельно, для этого нет встроенного решения.
0

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

Похожие вопросы