WPF: удалить явный цвет переднего плана элемента управления

Два образца текстовых полей со стандартной цветовой схемой и следующий конструктор дают Box1 с серым передним планом и Box2 с черным передним планом, поскольку цвет переднего плана Box2 был задан явно.

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        Box2.Foreground = Brushes.Black;
        Box1.IsEnabled = false;
        Box2.IsEnabled = false;
    }
}

Я хотел бы «сбросить» цвет переднего плана, чтобы Box2 «откатился» к отключенному по умолчанию цвету и имел серый передний план, когда для IsEnabled установлено значение false. Это возможно? Если да, то как это делается?

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


person Caleb    schedule 23.02.2011    source источник


Ответы (2)


Я не уверен, что вы имеете в виду это, но попробуйте следующий код:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        Box2.Foreground = Brushes.Black;
        Box1.IsEnabled = false;
        Box2.IsEnabled = false;
        Box2.ClearValue(TextBox.ForegroundProperty);
    }
}
person lipcu    schedule 23.02.2011
comment
Интересно, что очистка локального значения не обязательно восстанавливает то же значение по умолчанию. Читая о функции ClearValue, я обнаружил здесь обсуждение приоритета: msdn.microsoft.com/en-us/library/ms743230(v=vs.90).aspx и образец здесь: msdn.microsoft.com/en-us/library/ms771579(v=vs.90).aspx - person Caleb; 24.02.2011

Используйте событие IsEnabledChanged, чтобы установить передний план поля.

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        Box2.Foreground = Brushes.Black;
        Box1.IsEnabled = false;
        Box2.IsEnabled = false;
        Box1.IsEnabledChanged += new DependencyPropertyChangedEventHandler(label1_IsEnabledChanged);
    }

    void label1_IsEnabledChanged( object sender, DependencyPropertyChangedEventArgs e ) {
        //Set the foreground you want here!
    }

}

Но если вы не хотите явно задавать цвет, попробуйте установить для него Прозрачный o.O.

person renanleandrof    schedule 23.02.2011
comment
Спасибо за ответ, Ренанф. Однако я не понимаю, как использовать ваш ответ без явной установки цвета переднего плана в обработчике событий. Я хочу избежать явной установки цвета переднего плана, если это возможно. Я хотел бы, чтобы цвет переднего плана Box2 вернулся к отключенному цвету по умолчанию. Вы знаете, как это сделать? Я попытался использовать прозрачную кисть, но это сделало весь мой текст прозрачным. - person Caleb; 23.02.2011
comment
Что, если вы установите привязку для свойства Foreground, а в наборе/получении вы выполните логику, чтобы установить цвет в соответствии с тем, что вы хотите? - person renanleandrof; 23.02.2011
comment
Что бы я использовал в установщике/геттере, чтобы вернуть цвет переднего плана? - person Caleb; 23.02.2011