【发布时间】:2020-10-20 22:58:56
【问题描述】:
有没有办法在不更改本地主 Foreground 属性的情况下使用触发器或视觉状态更改 xaml 中自定义 TextBox 的 Foreground?
这是一个带有随机选择颜色的通用自定义 TextBox 的 xaml 样式:
<Style TargetType="{x:Type local:CustomTextBox}">
<Setter Property="Background" Value="White"/>
<Setter Property="BorderBrush" Value="Black"/>
<Setter Property="Foreground" Value="Black"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:CustomTextBox}">
<Border x:Name="PART_Border"
Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="1">
<ScrollViewer x:Name="PART_ContentHost"
HorizontalScrollBarVisibility="Hidden"
VerticalScrollBarVisibility="Hidden"
Focusable="False"/>
</Border>
<ControlTemplate.Triggers>
<!-- Can be IsMouseOver, IsFocused, etc... -->
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="PART_Border"
Property="Background" Value="Green"/>
<Setter TargetName="PART_Border"
Property="BorderBrush" Value="DarkGreen"/>
<!-- The only method I know that works is this one
that changes the local property -->
<Setter Property="Foreground" Value="Yellow"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
我尝试在触发器中使用这些行,但每个人都失败了(什么都不做):
<Setter TargetName="PART_ContentHost" Property="Foreground" Value="Yellow"/>
<Setter TargetName="PART_ContentHost" Property="TextBlock.Foreground" Value="Yellow"/>
<Setter TargetName="PART_ContentHost" Property="TextElement.Foreground" Value="Yellow"/>
<Setter TargetName="PART_Border" Property="TextBlock.Foreground" Value="Yellow"/>
<Setter TargetName="PART_Border" Property="TextElement.Foreground" Value="Yellow"/>
在按钮中,可以通过更改父元素的TextBlock.Foreground(例如PART_Border 的TextBlock.Foreground)来更改前景色,但这不适用于TextBox。
像此行一样更改本地属性...
<Setter Property="Foreground" Value="Yellow"/>
...有一个问题,如果我稍后更改主前景属性(例如从黑色到灰色),触发器不能再将其更改为黄色,例如:
<local:CustomTextBox ... Foreground="Gray"/>
VisualStates 甚至无法与主 Foreground 属性交互。
那么还有其他我不知道的方法可以在 xaml 中实现这一点,还是 wpf 的限制?
【问题讨论】:
标签: wpf triggers textbox foreground visualstates