Как изменить цвет фона и шрифта для элементов ListBox? - PullRequest
0 голосов
/ 17 января 2019

Я создал условие форматирования:

  • Если текст содержит - Success, то цвет фона - Green, цвет ForeGround - Black;
  • Если текст содержит - Error "цветной фон Red, передний план равен Black;
  • Другие случаи: цвет фона White, цвет переднего плана Black;

Вопрос.
Как изменить цвета фона / переднего плана для элемента ListBox, который я выбрал для выполнения Условие 1 ?

Состояние 1 . Состояние для выбранного товара:

  • фон Color.Blue;
  • передний план Color.White (или Color.Black);

Проблема:
Мой код не рисует элемент ListBox, который является Color.White.

private SolidBrush reportsForegroundBrushSelected = new SolidBrush(Color.Black);
private SolidBrush reportsBackgroundBrushSelected = new SolidBrush(Color.FromKnownColor(KnownColor.Highlight));

private SolidBrush reportsForegroundBrush = new SolidBrush(Color.Black);
private SolidBrush reportsBackgroundBrush1 = new SolidBrush(Color.LimeGreen);
private SolidBrush reportsBackgroundBrush2 = new SolidBrush(Color.Salmon);
private SolidBrush reportsBackgroundBrush3 = new SolidBrush(Color.White);

private void listBox1_DrawItem(object sender, DrawItemEventArgs e)
{
    e.DrawBackground();
    bool selected = ((e.State & DrawItemState.Selected) == DrawItemState.Selected);

    int index = e.Index;
    if (index >= 0 && index < listBox1.Items.Count)
    {
        string text = listBox1.Items[index].ToString();
        Graphics g = e.Graphics;

        //background:
        SolidBrush backgroundBrush;
        if (selected)
        {
            backgroundBrush = reportsBackgroundBrushSelected;
        }
        else
        {
            if (text.Contains("Success"))
            {
                backgroundBrush = reportsBackgroundBrush1;
            }
            else
            {
                backgroundBrush = reportsBackgroundBrush2;
            }
        }

        if (!text.Contains("Success") && !text.Contains("Error"))
        {
            backgroundBrush = reportsBackgroundBrush3;
        }

        g.FillRectangle(backgroundBrush, e.Bounds);

        //text:
        SolidBrush foregroundBrush = (selected) ? reportsForegroundBrushSelected : reportsForegroundBrush;
        g.DrawString(text, e.Font, foregroundBrush, listBox1.GetItemRectangle(index).Location);
    }
    e.DrawFocusRectangle();
}

enter image description here

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Даже если явно не запрашивается, я предлагаю другой способ управления кистями, который, как мне кажется, может упростить переключатель 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);
        }
    }
}
0 голосов
/ 17 января 2019

Проблема в вашем порядке if/else.

Установите это так:

if (selected)
{
    backgroundBrush = reportsBackgroundBrushSelected;
}
else
{
    if (text.Contains("Success"))
    {
        backgroundBrush = reportsBackgroundBrush1;
    }
    else if(text.Contains("Error"))
    {
        backgroundBrush = reportsBackgroundBrush2;
    }
    else
    {
        backgroundBrush = reportsBackgroundBrush3;            
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...