我有一个TextBox:
<TextBox IsEnabled="{Binding IsChecked, ElementName=Cb_AllowDeletingPictures}"
Style="{DynamicResource TextBoxInError}">
<TextBox.Text>
<Binding Path="TimeBeforeDeletingPicture" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<helpers:TimeBeforeDeletingRule/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>TextBoxInError样式包含Validation.ErrorTemplate属性的模板和设置工具提示并将BorderBrush和Foreground变为红色的MultiTrigger,如下所示:
<Style x:Key="TextBoxInError" TargetType="{x:Type TextBox}">
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<DockPanel>
<TextBlock Foreground="Red" FontSize="20" FontWeight="Bold" Text="!" FontFamily="Segoe UI Light"></TextBlock>
<AdornedElementPlaceholder/>
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="Validation.HasError" Value="True"></Condition>
<Condition Property="IsMouseOver" Value="True"></Condition>
</MultiTrigger.Conditions>
<Setter Property="Foreground" Value="Red" />
<Setter Property="BorderBrush" Value="Red"/>
<Setter Property="ToolTip"
Value="{Binding (Validation.Errors)[0].ErrorContent, RelativeSource={x:Static RelativeSource.Self}}"/>
</MultiTrigger>
</Style.Triggers>
</Style>现在,正如您在下一个屏幕截图中看到的,ErrorTemplate很好地在TextBox之前显示一个红色感叹号,问题是:
is not over TextBox时,前景和BorderBrush都不是红色的,这很好。is over TextBox的区域时,只有前景变为红色,而当鼠标在其上方时,BorderBrush保持其原始行为。当鼠标不在TextBox区域上时:

当鼠标越过TextBox区域时:

为什么会有这样的行为,为什么它是为前景而不是为BorderBrush工作呢?我漏掉了什么吗?
发布于 2014-08-30 14:14:40
在TextBox的默认模板中,触发器被定义为在MouseOver上将BorderBrush设置为在鼠标上看到的蓝色。这就是为什么你的扳机不起作用。您必须重写默认模板并删除该触发器以使其工作。
以如下方式声明模板(我已经从控件模板中删除了默认触发器)
<Style x:Key="TextBoxInError" TargetType="TextBox">
<!-- Your other setters -->
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TextBoxBase">
<Border
BorderThickness="{TemplateBinding Border.BorderThickness}"
BorderBrush="{TemplateBinding Border.BorderBrush}"
Background="{TemplateBinding Panel.Background}"
Name="border"
SnapsToDevicePixels="True">
<ScrollViewer
HorizontalScrollBarVisibility="Hidden"
VerticalScrollBarVisibility="Hidden"
Name="PART_ContentHost"
Focusable="False" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="UIElement.IsEnabled"
Value="False">
<Setter Property="UIElement.Opacity"
TargetName="border"
Value="0.56"/>
</Trigger>
<Trigger Property="UIElement.IsKeyboardFocused"
Value="True">
<Setter Property="Border.BorderBrush"
TargetName="border">
<Setter.Value>
<SolidColorBrush>#FF569DE5</SolidColorBrush>
</Setter.Value>
</Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
<!-- Your triggers -->
</Style>我从默认模板中删除的触发器如下所示:
<Trigger Property="UIElement.IsMouseOver" Value="True">
<Setter
Property="Border.BorderBrush"
TargetName="border">
<Setter.Value>
<SolidColorBrush>#FF7EB4EA</SolidColorBrush>
</Setter.Value>
</Setter>
</Trigger>https://stackoverflow.com/questions/25583157
复制相似问题