моя проблема немного похожа на эту:
Возникла проблема с моим шаблоном управления 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" />
). Он работает так же, как и все остальные элементы управления.
но при попытке воспроизвести это с помощью textBox, оно вообще не работает.
вот мой код:
<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 (событие привязки или изменения свойства или что-то еще?)
если бы кто-нибудь мог мне это объяснить, это было бы здорово!
если бы кто-то мог даже предложить хорошее решение (такое, которое не включает в себя мерзкий взлом, подобный тому, который я использую в данный момент, но не покажу здесь, чтобы не нанести серьезного вреда глазу читателю), это было бы еще лучше !