【发布时间】:2017-11-16 17:30:14
【问题描述】:
我正在尝试通过在ResourceDictionary 中定义的Style 将样式应用于所有FrameworkElement 对象。在一个特定的视图中,我包含了资源字典,并且上面有一个 TextBox,我想使用该样式。
所以,这是我玩过的两个定义:
<!-- STYLE USED BY ALL FRAMEWORK ELEMENTS TO DISPLAY TOOLTIP ON VALIDATION ERROR -->
<Style TargetType="{x:Type FrameworkElement}">
<Style.Triggers>
<Trigger Property="Validation.HasError"
Value="True">
<Setter Property="ToolTip"
Value="{Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors).CurrentItem.ErrorContent}" />
</Trigger>
</Style.Triggers>
</Style>
<!-- STYLE USED BY ALL TEXTBOX CONTROLS FOR VALIDATION ERROR DISPLAY -->
<Style TargetType="{x:Type TextBox}">
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<DockPanel LastChildFill="True">
<Image DockPanel.Dock="Right"
Source="{StaticResource imgDisallow16}" Width="16"/>
<Border BorderBrush="Red"
BorderThickness="1">
<AdornedElementPlaceholder />
</Border>
</DockPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
正如所写,Tooltip 的样式不会生效。如果我给该样式一个x:Key 并直接在TextBox 上引用该名称,它就可以工作。但是为什么FrameworkElement 类型不这样做呢?因为TextBox继承自它,也就是说。
同样,如果我将 Tooltip 触发器添加到第二种样式中,则可以。那个没有名字,但目标是TextBox。那么为什么没有名字就可以工作,而第一个却不行呢?
编辑:这是`TextBox
<TextBox Grid.Row="0"
Grid.Column="2">
<TextBox.Text>
<Binding Path="CurrentEquipment.Name"
Mode="TwoWay"
ValidatesOnNotifyDataErrors="True"
NotifyOnValidationError="True"
UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<vr:EmailValidationRule />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
【问题讨论】:
-
它只是不能这样工作。您的
FrameworkElement样式不会应用于子类(文本框、按钮或任何其他)。样式完全按类型匹配。