Как установить цвет шрифта метки таким же, как цвет заголовка GroupBox?

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

Могу ли я сделать это, не изменяя заголовок GroupBox по умолчанию?

ОБНОВИТЬ:

Я попытался установить для Label ForeColor значение ActiveCaption, это выглядит нормально для схемы по умолчанию (синий), но когда я меняю схему на Olive Green, заголовки метки и группового поля не совпадают.

Кроме того, нормальное поведение GroupBox заключается в том, что установка FlatStyle на Standard устанавливает цвет заголовка на ForeColor, однако, чтобы создать новый GroupBox и установить его ForeColor на ControlText, вы должны сначала установить для него значение, отличное от ControlText, а затем снова установить его. (Если вы не понимаете, что я имею в виду, попробуйте и убедитесь.)

Ответов (3)

Решение

Хм, тот же вопрос? Повторю свой пост:

using System.Windows.Forms.VisualStyles;
...

    public Form1()
    {
      InitializeComponent();
      if (Application.RenderWithVisualStyles)
      {
        VisualStyleRenderer rndr = new VisualStyleRenderer(VisualStyleElement.Button.GroupBox.Normal);
        Color c = rndr.GetColor(ColorProperty.TextColor);
        label1.ForeColor = c;
      }
    }

Я предполагаю, что вы используете Windows Forms, а не WPF. Когда вы применяете цвета, используйте системные цвета (например, Control или HighlightText), они будут изменены, когда пользователь переключит тему Windows. Вот код, чтобы установить цвет группового поля на системный цвет, а затем применить этот цвет для метки:

groupBox1.ForeColor = SystemColors.ActiveBorder;
label1.ForeColor = groupBox1.ForeColor;

Метка предоставляет событие ForeColorChanged. Затем вы можете сделать что-то вроде этого:

this.label1.ForeColorChanged += (o,e) => { this.groupBox1.ForeColor = this.label1.ForeColor;};

Однако, если вы пытаетесь определить, когда пользователь меняет свою тему, вы можете подключиться к SystemEvents, которая находится в пространстве имен Microsoft.Win32. Что-то вроде этого:

    Microsoft.Win32.SystemEvents.UserPreferenceChanged += new Microsoft.Win32.UserPreferenceChangedEventHandler(SystemEvents_UserPreferenceChanged);

void SystemEvents_UserPreferenceChanged(object sender, Microsoft.Win32.UserPreferenceChangedEventArgs e)
        {
            this.groupBox1.ForeColor = this.label1.ForeColor;
        }