Изменить цвет контура ComboBox - PullRequest
0 голосов
/ 27 сентября 2018

Я пытаюсь управлять цветом ComboBox.Хотя можно изменить цвет фона, я не могу найти свойство для контура границы.

Просто нарисовать квадрат, как граница, не будет в темной теме из-за стрелки.Это приводит меня к выводу, что эта граница может быть действительным файлом изображения.

Возможно ли заменить это?

enter image description here

ОБНОВЛЕНИЕ: Я реализовал решение @AhmedAbdelhameed - теперь оно выглядит намного лучше.Однако для плоского стиля я должен был отрегулировать прямоугольник следующим образом:

using (var p = new Pen(this.BorderColor, 1))
{
    g.DrawRectangle(p, 0, 0, Width - buttonWidth - 1, Height - 1);
}

Я также обменял 'BorderColor', чтобы соответствовать остальной части моего пользовательского интерфейса:

public CustomComboBox()
{
    BorderColor = Color.Gray;
} 

Этопока результат: enter image description here enter image description here

То, что я хотел бы сделать сейчас, - это изменить фактическую кнопку выпадающего меню (возможно,с оверлеем png) только в темной теме

ОБНОВЛЕНИЕ: Мне удалось добавить ящик цен в пользовательский элемент управления со следующим кодом:

using (var g = Graphics.FromHwnd(Handle))
{
    using (var p = new Pen(this.BorderColor, 1))
    {
        g.DrawRectangle(p, 0, 0, Width - buttonWidth - 1, Height - 1);
    }
    if (Properties.Settings.Default.Theme == "Dark")
    {
        g.DrawImageUnscaled(Properties.Resources.dropdown, new Point(Width - buttonWidth - 1));
    }
}

выглядит потрясающе!Более или менее по совпадению, которое я не понимаю, темная выпадающая кнопка даже исчезает, когда я меняю тему в выпадающем списке тем.

До - После сравнения: enter image description here enter image description here

1 Ответ

0 голосов
/ 27 сентября 2018

С помощью этого ответа я смог придумать следующее:

Сначала добавьте в свою форму следующее, чтобы избежать мерцания:

protected override CreateParams CreateParams
{
    get
    {
        CreateParams handleParam = base.CreateParams;
        handleParam.ExStyle |= 0x02000000;      // WS_EX_COMPOSITED
        return handleParam;
    }
}

Теперь добавьте следующий класс в ваш проект:

public class CustomComboBox : ComboBox
{
    private const int WM_PAINT = 0xF;
    private int buttonWidth = SystemInformation.HorizontalScrollBarArrowWidth;
    protected override void WndProc(ref Message m)
    {
        base.WndProc(ref m);
        if (m.Msg == WM_PAINT)
        {
            using (var g = Graphics.FromHwnd(Handle))
            {
                // Uncomment this if you don't want the "highlight border".
                /*
                using (var p = new Pen(this.BorderColor, 1))
                {
                    g.DrawRectangle(p, 0, 0, Width - 1, Height - 1);
                }*/
                using (var p = new Pen(this.BorderColor, 2))
                {
                    g.DrawRectangle(p, 2, 2, Width - buttonWidth - 4, Height - 4);
                }
            }
        }
    }

    public CustomComboBox()
    {
        BorderColor = Color.DimGray;
    }

    [Browsable(true)]
    [Category("Appearance")]
    [DefaultValue(typeof(Color), "DimGray")]
    public Color BorderColor { get; set; }
}

Перестройте проект, замените элементы управления ComboBox новым CustomComboBox, установите для свойства BorderColor выбранный вами цвет,и все готово.

Результат:

ComboBox_BorderColor

Обновление:

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

using (var p = new Pen(this.BorderColor, 3))
{
    g.DrawRectangle(p, 1, 1, Width - buttonWidth - 3, Height - 3);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...