моя проблема немного похожа на эту: Возникла проблема с моим TextBox шаблон управления
но я хотел бы пойти немного дальше:
моя проблема проста: у меня есть шаблонные элементы управления (метки, текстовые поля, флажки и т. д.). Каждый элемент управления имеет значение по умолчанию, которое можно переопределить во время выполнения, установив значение свойства экземпляра элемента управления. И независимо от того, какое значение было установлено для свойства, значения, которые я решил использовать, когда IsEnabled = false, должны преобладать.
теперь я знаю, что приоритет значений в WPF препятствует простой реализации этого поведения (как я узнал из другого вопроса: http://msdn.microsoft.com/en-us/library/ms743230.aspx)
но мне удалось найти обходной путь, который довольно хорошо справляется со своей задачей, за исключением свойства Foreground в TextBox. (и только этот конкретный случай)
Итак, просто позаботившись о значении переднего плана, вот что я делаю с меткой: (я избавился от всех других свойств для большей ясности)
<Style TargetType="Label">
<Setter Property="Foreground" Value="Blue"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Label">
<Border>
<ContentPresenter Name="ContentSite"/>
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="false">
<Setter TargetName="ContentSite" Property="TextBlock.Foreground" Value="Red"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Таким образом, по умолчанию метка будет иметь синий текст, который я могу переопределить, скажем, зеленым, выполнив: myLabel.Foreground = Brushes.Green
в коде позади, а затем, независимо от того, что я установил, если я напишу: MyLabel.IsEnabled = False
, текст станет Красный.
и эта техника прекрасно работает. (т.е. эта строка в xaml выведет красный текст: <Label Foreground="Green" IsEnabled="False" />
). Аналогично работает со всеми остальными элементами управления.
но при попытке воспроизвести это с помощью текстового поля это вообще не работает.
вот мой код:
<Style TargetType="TextBox">
<Setter Property="Foreground" Value="Blue"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TextBox">
<Grid>
<Border Name="Border">
<ScrollViewer x:Name="PART_ContentHost" />
</Border>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="False">
<Setter TargetName="PART_ContentHost" Property="Foreground" Value="Red"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Я безуспешно пытался добавить Foreground="{TemplateBinding Foreground}"
в PART_ContentHost.
Я подозреваю, что это как-то связано с тем фактом, что PART_ContentHost является просмотрщиком прокрутки, и происходит какое-то скрытое (по крайней мере, от меня) наследование.
единственное другое объяснение, которое я могу найти, заключается в том, что класс TextBox имеет какую-то специальную обработку, которая жестко кодирует связь между самим элементом управления и его частью PART_ContentHost (событие привязки или изменения свойства или что-то еще?)
если бы кто-то мог объяснить это мне, это было бы здорово! если бы кто-то мог даже предложить хорошее решение (тот, который не включает в себя неприятный хак, подобный тому, который я использую в данный момент, но не буду показывать здесь, чтобы не причинить серьезной травмы глаза читателю), это было бы еще лучше !