Windows Forms: как изменить цвет шрифта для отключенной метки?

Я пытаюсь установить отключенные характеристики шрифта для элемента управления Label. Я могу установить все характеристики шрифта (размер, полужирный и т.д.), Но цвет переопределяется поведением окон по умолчанию, которое представляется одним из этих двух цветов:

  • Если цвет фона прозрачный, то ForeColor такой же, как TextBox отключен Цвет.
  • Если цвет фона установлен на что-то еще, ForeColor - темно-серый цвет.

Изображение ниже демонстрирует поведение - столбец 1 - это метки, столбец 2 - это текстовые поля, а столбец 3 - это поля со списком.

alt text

Редактировать - Объяснение изображения: первые две строки являются стилями по умолчанию для метки, текстового поля и комбинированного списка. Во вторых двух строках я установил цвет фона на красный, а передний план на белый. Отключенная обработка стиля шрифта Microsoft не согласована.

Ответ 1

Взгляните на метод ControlPaint.DrawStringDisabled; это может быть что-то полезное. Я использовал его при переопределении события OnPaint для пользовательских элементов управления.

ControlPaint.DrawStringDisabled(g, this.Text, this.Font, Color.Transparent,
                new Rectangle(CustomStringWidth, 5, StringSize2.Width, StringSize2.Height), StringFormat.GenericTypographic);

Ответ 2

Вы пытались реализовать событие EnabledChanged? Или вы ищете больше свойств "стилей" на элементе управления (насколько я знаю, их не существует)?

Ответ 3

Для текстового поля вы можете установить для свойства readonly значение true, пока элемент управления включен. Затем вы можете установить свойство BackColor и ForeColor в любое удобное для вас время. Пользователь все равно сможет щелкнуть элемент управления и иметь мигающий курсор, но они ничего не смогут редактировать.

Не уверен, что это экстраполируется на другие типы управления, такие как комбинированные поля или что-то еще, поскольку у меня еще не было возможности экспериментировать, но это стоит того.

Ответ 4

Почему это проблема?

Я бы лично разрешил Windows обрабатывать его. Люди привыкли к отключенным элементам, которые выглядят определенным образом, поэтому, если вы начинаете пытаться изменить каждый аспект способа, которым они выглядят, вы можете запутать своих пользователей.

Ответ 5

Вам, вероятно, придется переопределить событие Paint. Все инструменты, которые я использовал до сих пор, имеют ту же проблему, когда элемент управления отключен. Просто угадайте, что они позволяют окнам рисовать текст. Что касается этикеток, то они не являются стандартным контролем и почему они работают.

Ответ 7

Я переопределил метод OnPaint моего контроля с помощью метода OnPaint ниже. Я вставил весь класс управления, чтобы упростить его копирование.

public partial class NewLabel : Label
{
    public NewLabel()
    {
        InitializeComponent();
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        TextRenderer.DrawText(e.Graphics, this.Text.ToString(), this.Font, ClientRectangle, ForeColor);
    }

}