Даже если явно не запрашивается, я предлагаю другой способ управления кистями, который, как мне кажется, может упростить переключатель ForeColor / BackColor и позволяет лучше настроить представление ListBox.
Создание объекта класса, который содержит все выбранные / предварительно выбранные кисти и предоставляет общедоступные свойства для изменения этих значений, если / когда это необходимо.
Кроме того, этот класс предоставляет метод для возврата правильной комбинации кистей.выбор правильных на основе пары условий:
- Текстовое содержимое текущего элемента
- Статус его выбора (
Selected/Focused
или NotAccelerator/NotFocusedRect
)
Класс довольно прост.
Он имеет перегруженный конструктор, который позволяет указывать значения по умолчанию или специфические атрибуты Color в соответствии со стандартным внешним видом элемента управления ListBox.
При использовании конструктора по умолчанию (пустого) для комбинации цветов ForeGround / BackGround по умолчанию установлено значение Color.Black
и Color.White
:
public ReportsBrushes() : this(Color.White, Color.Black) { }
, в противном случае он принимает 2 параметра,для установки определенных значений:
public ReportsBrushes(Color ItemBackColor, Color ItemForeColor)
{
this.StandardForeground = new SolidBrush(ItemForeColor);
this.StandardBackground = new SolidBrush(ItemBackColor);
}
Это упрощает метод ListBox.DrawItem
:
private ReportsBrushes reportsBrushes = new ReportsBrushes();
private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
{
ListBox ctl = sender as ListBox;
e.Graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
e.DrawFocusRectangle();
var itemColors = reportsBrushes.GetItemBrushes(ctl.Items[e.Index].ToString(), e.State.HasFlag(DrawItemState.Selected));
using (StringFormat format = new StringFormat())
{
format.LineAlignment = StringAlignment.Center;
e.Graphics.DrawString(ctl.Items[e.Index].ToString(), ctl.Font, itemColors.ForeColor, e.Bounds, format);
}
}
private void listBox1_MeasureItem(object sender, MeasureItemEventArgs e)
{
e.ItemHeight = listBox1.Font.Height + 4;
}
Класс ReportsBrushes
:
internal class ReportsBrushes
{
public ReportsBrushes() : this(Color.White, Color.Black) { }
public ReportsBrushes(Color ItemBackColor, Color ItemForeColor)
{
this.StandardForeground = new SolidBrush(ItemForeColor);
this.StandardBackground = new SolidBrush(ItemBackColor);
}
public SolidBrush StandardForeground { get; set; }
public SolidBrush StandardBackground { get; set; }
public SolidBrush SelectedForeground { get ; set ; } =
new SolidBrush(Color.FromKnownColor(KnownColor.HighlightText));
public SolidBrush SelectedBackground { get; set; } =
new SolidBrush(Color.FromKnownColor(KnownColor.Highlight));
public SolidBrush SuccessBackground { get; set; } =
new SolidBrush(Color.LimeGreen);
public SolidBrush ErrorBackground { get; set; } =
new SolidBrush(Color.OrangeRed);
public (SolidBrush ForeColor, SolidBrush BackColor) GetItemBrushes(string ItemText, bool ItemSelected)
{
if (ItemSelected)
return (this.SelectedForeground, this.SelectedBackground);
else
{
if (ItemText.Contains("Success"))
return (this.StandardForeground, this.SuccessBackground);
if (ItemText.Contains("Error"))
return (this.StandardForeground, this.ErrorBackground);
return (this.StandardForeground, this.StandardBackground);
}
}
}