Как отключить цвет фона в TextBox в WPF
Я видел следующий stream, который связан с моим вопросом:
WPF ComboBox: цвет фона при отключении
Вышеупомянутое касается изменения шаблона контента для ComboBox
. Я работаю с WPF, я несколько новичок в стилях и шаблонах, и я хочу изменить тусклый серый цвет фона отключенного TextBox
на другой цвет. Мы часто используем TextBoxes
в нашем приложении, и мы находим, что настройки цвета по умолчанию трудно читать.
- Как реализовать макрос (или шаблон) no-op в C ++?
- C ++ шаблоны Turing-complete?
- Полезные шаблоны кода Java Eclipse
- Шаблон функции Variadic с расширением пакета не в последнем параметре
- Специализация шаблонов псевдонимов
Я создал следующую попытку решения. Но, конечно, это не сработает. Может ли кто-нибудь дать мне мнение о том, почему?
- Обнаружение constexpr с помощью SFINAE
- Что такое руководства по вычитанию шаблонов и когда мы должны их использовать?
- gcc может скомпилировать вариационный шаблон, в то время как clang не может
- перегрузка оператора друга << для шаблона classа
- Использование SFINAE для проверки глобального оператора <<?
- Идентификация примитивных типов в шаблонах
- Как определить существование classа с использованием SFINAE?
- Как получить список текущих переменных из шаблона Jinja 2?
К сожалению для элемента управления TextBox, похоже, что это не так просто, как просто добавление триггера и изменение цвета фона, когда условие триггера истинно. Для этого вам нужно переопределить весь контрольный шаблон. Ниже приведен пример того, как вы можете это сделать:
РЕДАКТИРОВАТЬ:
Отвечая на ваш вопрос, я попытался добавить стиль ComboBox к моему первоначальному ответу выше, и мне удалось интегрировать его без ошибок. Я не уверен, хотя, если он ведет себя так, как вы этого хотели. Я просто скопировал-вставить то, что указано в указанной вами ссылке.
TextBox
Вы можете использовать приведенный ниже fragment:
Вместо проверки свойства IsEnable используйте свойство IsReadonly элемента управления TextBox.
Если вам необходимо применить его для всех элементов управления текстовыми полями, используйте приведенный выше код. Для конкретного текстового поля просто установите ключ и примените стиль к этому текстовому полю.
Для этой ситуации мне нравится установить Focusable=false
и установить цвет фона на мое желаемое значение (в триггере с привязкой к данным). Возможно, это немного взломанно, но так же переписывает шаблон управления для всего TextBox
. Альтернативой Focusable
является IsReadyOnly
, но это не работает для многих элементов управления. Тем не менее, это гарантирует, что каретка исчезнет.
Вы никогда не используете ControlTemplate, который вы определили. Кроме того, вам нужен стиль, а не (обязательно) ControlTemplate.
Я думаю, вы хотите что-то вроде следующего:
Старайтесь избегать переопределения шаблонов управления, где вы можете. Они, как правило, добавляют много накладных расходов на код, и со временем их становится сложно поддерживать.
Я бы использовал следующий код в событии Loaded:
ClassicBorderDecorator o = VisualTreeHelper.GetChild(this.textBox1, 0) as ClassicBorderDecorator; if (o != null) { o.Background = new SolidColorBrush(Colors.Transparent); }
Если вы посмотрите на шаблон текстового поля, вы заметите, что шаблон имеет триггер для свойства IsEnabled False и устанавливает его цвет фона элемента «Bd» в SystemColors.ControlBrushKey.
Если вы переопределите этот цвет в стиле, он достигнет того, что вы хотите сделать.
By adding after and before will make your text box behave like normal winforms textbox.
Код, взятый со следующей веб-страницы:
wpf: выбор текста в TextBox с помощью IsReadOnly = true?
И стиль изменен для соответствия winforms. (Их появление включено = false, not readonly = true)
И, конечно, в вашем текстовом поле должен быть установлен атрибут IsReadOnly = «True».