Как изменить цвет выбранного элемента в списке на определенное значение ARGB? - PullRequest
0 голосов
/ 21 мая 2019

Я хочу изменить цвет выбранного элемента в списке на определенное значение ARGB. Когда он не выбран, он показывает ForeColor, который я определил в свойствах моего listBox.

Но что бы я ни пытался, это либо установка кисти на предопределенный цвет (белый, зеленый, что угодно), изменение цвета, когда выбран и не выбран для обоих в том же цвете ... или это не меняется вообще. Решения, которые я вижу в stackoverflow, основаны на XAML, но я использую Winforms C # .NET, так что это не вариант.

Мне удалось создать собственный список ListBox, уже используя OwnerDrawFixed в качестве DrawMode и пользовательский DrawItem, предопределенный следующим образом:

        {
            SolidBrush myBrushBack = new SolidBrush(Color.FromArgb(255, 42, 42, 42));
            SolidBrush myBrushFore = new SolidBrush(Color.FromArgb(255, 62, 182, 86));

            if (e.Index < 0) return;
            e.DrawBackground();
            Graphics g = e.Graphics;
            Brush brush = ((e.State & DrawItemState.Selected) == DrawItemState.Selected) ?
                            myBrushBack : new SolidBrush(e.BackColor);
                            myBrushFore : new SolidBrush(e.ForeColor);

            g.FillRectangle(brush, e.Bounds);
            SizeF size = e.Graphics.MeasureString(listBoxTracks.ToString(), e.Font);
            e.Graphics.DrawString(listBoxTracks.Items[e.Index].ToString(), e.Font,
                     new SolidBrush(e.ForeColor), e.Bounds.Left + (e.Bounds.Width / 29 - size.Width / 39), e.Bounds.Top + (e.Bounds.Height / 2 - size.Height / 2), StringFormat.GenericDefault);
            e.DrawFocusRectangle();

        }

Этот код не дает мне нужный мне зеленый цвет + он меняет выбранный и не выбранный цвет текста для обоих:

 e.Graphics.DrawString(listBoxTracks.Items[e.Index].ToString(), e.Font, Brushes.Green, e.Bounds, StringFormat.GenericDefault);

Как себя ведет сейчас: https://imgur.com/a/VvhDjqQ

Как я хочу, чтобы он вел себя: https://imgur.com/a/IqNT70p

1 Ответ

0 голосов
/ 21 мая 2019

Благодаря Jimi я адаптировал код и теперь он работает правильно, используя код, подобный следующему:

        {
            if (e.Index < 0) return;
            e.DrawBackground();
            bool isItemSelected = ((e.State & DrawItemState.Selected) == DrawItemState.Selected);
            using (SolidBrush bgBrush = new SolidBrush(isItemSelected ? Color.FromArgb(255, 42, 42, 42) : Color.FromArgb(255, 29, 29, 29)))
            using (SolidBrush itemBrush = isItemSelected ? new SolidBrush(Color.FromArgb(255, 62, 182, 86)) : new SolidBrush(Color.FromArgb(255, 176, 176, 176)))
            {
                string itemText = listBoxTracks.GetItemText(listBoxTracks.Items[e.Index]);
                e.Graphics.TextRenderingHint = TextRenderingHint.ClearTypeGridFit;
                SizeF size = e.Graphics.MeasureString(listBoxTracks.ToString(), e.Font);
                e.Graphics.FillRectangle(bgBrush, e.Bounds);
                e.Graphics.DrawString(itemText, e.Font, itemBrush, e.Bounds.Left + (e.Bounds.Width / 29 - size.Width / 39), e.Bounds.Top + (e.Bounds.Height / 2 - size.Height / 2), StringFormat.GenericDefault);
            }
            e.DrawFocusRectangle();
        }
...