Я создал пользовательский элемент winform, который имеет текстовое поле и список, совместно использующие один и тот же источник связывания, чтобы список можно было фильтровать с помощью ввода текстового поля.winform listbox drawitem change substring color
Мне нужно переопределить drawisem lisbox, чтобы отфильтрованные элементы искали текст в качестве подстроки, чтобы быть другого цвета или выделены. (т. е.) Ожидается желтая подсветка, например, ниже образца изображения.
Я сделал, как ниже
private void DrawItemHandler(object sender, DrawItemEventArgs e)
{
this.Invoke((MethodInvoker)delegate
{
e.DrawBackground();
e.DrawFocusRectangle();
string MyString = listBox.GetItemText(listBox.Items[e.Index]);
string stringToFind = searchInput.Text ;
if (!string.IsNullOrEmpty(stringToFind))
{
List<int> positions = new List<int>();
int pos = 0;
while ((pos < MyString.Length) && (pos = MyString.IndexOf(stringToFind, pos, StringComparison.InvariantCultureIgnoreCase)) != -1)
{
positions.Add(pos);
pos += stringToFind.Length;
}
int c = 0, nLen = 0, width = 0;
Rectangle rect = e.Bounds;
rect.X = width;
do
{
if (positions.Contains(c))
{
//int opacity = 128;
e.Graphics.DrawString(MyString.Substring(c, stringToFind.Length),
e.Font,
//new SolidBrush(Color.FromArgb(opacity, Color.LightYellow)),
new SolidBrush(Color.LightYellow),
rect);
nLen = MyString.Substring(c, stringToFind.Length).Length;
width += nLen;
}
else
{
e.Graphics.DrawString(MyString[c].ToString(),
e.Font,
new SolidBrush(listBox.ForeColor),
rect);
nLen = MyString[c].ToString().Length;
width += nLen;
}
rect.X = width;
}
while ((c += nLen) < MyString.Length);
}
else
{
e.Graphics.DrawString(MyString,
e.Font,
new SolidBrush(listBox.ForeColor),
e.Bounds);
}
});
}
и результат был текстовый элемент перезапись символов.
Я не могу определить, часть ошибок, является ее в Прямоугольных или шнурке части. Также, помимо цвета фона элемента, как изменить фон подстроки в тексте элемента. Пожалуйста помоги мне с этим.
Чтобы изменить Backgroud подстроки, я подозреваю, вы должны сначала использовать FillRectangle и затем DrawString над этим прямоугольником – Pikoh
Чтобы использовать пользовательское использование BackColor TextRenderer вместо DrawString! Ваш способ продвигать прямоугольник. X использует длину строки в символах вместо пикселей. Используйте Graphics.MeasureString (... Typographics), чтобы узнать, насколько широка выделенная часть. – TaW
Пробовал MeasureString с предложением FillRectangle, и я вижу разницу, но все еще нуждаюсь в небольшой настройке. Спасибо, парни. – madmonk88