Validation.HasError和自定义工具提示

时间:2015-03-23 14:54:11

标签: c# wpf

我为ResourceDictionary中有错误的字段设置了额外的工具提示

<Style TargetType="TextBox">
    <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter Property="ToolTip" 
                    Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
        </Trigger>
    </Style.Triggers>
</Style>

我还为此工具提示定义了特殊样式,模拟右上角红色三角形的样式

<Style TargetType="ToolTip">
    <Setter Property="OverridesDefaultStyle" Value="true"/>
    <Setter Property="HasDropShadow" Value="True"/>
    <Setter Property="Placement" Value="Right"/>
    <Setter Property="HorizontalOffset" Value="5"/>
    <Setter Property="Foreground" Value="White" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ToolTip">
                <Border Name="Border"
                        Background="Red"
                        Width="{TemplateBinding Width}"
                        Height="{TemplateBinding Height}">
                    <ContentPresenter Margin="5 2 5 3" 
                                      HorizontalAlignment="Center"
                                      VerticalAlignment="Center" />
                </Border>
                <ControlTemplate.Triggers>
                    <EventTrigger RoutedEvent="Opened">
                        <BeginStoryboard>
                            <Storyboard TargetProperty="HorizontalOffset">
                                <DoubleAnimation From="0" To="5" Duration="0:0:0.1" />
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

一切正常,但现在所有工具提示都有这种风格。

只有在Validation.HasError发生时才能实现ToolTip样式吗?我可以作为x:Key,但是如何将它应用于Style.Triggers部分?

因为我已经在其他控件上定义了这个工具提示,所以我不想多次复制所有这些代码,但如果只是一个解决方案,我会这样做:(

2 个答案:

答案 0 :(得分:0)

您可以在Validation.ErrorTemplate样式上设置属性TextBox

<Style TargetType="{x:Type TextBox}">    
        <Setter Property="Validation.ErrorTemplate"
                Value="{StaticResource ValidationTemplate}" />
        <Style.Triggers>
            <Trigger Property="Validation.HasError"
                     Value="true">
                <Setter Property="ToolTip"
                        Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}"/>
            </Trigger>
        </Style.Triggers>
</Style>

但是,这样您无法使用ToolTip样式,但必须使用模板和x:Key

<ControlTemplate x:Key="ValidationTemplate">
      <Border Name="Border"
              Background="Red"
              Width="{TemplateBinding Width}"
              Height="{TemplateBinding Height}">
           <ContentPresenter Margin="5 2 5 3" 
                             HorizontalAlignment="Center"
                             VerticalAlignment="Center" />
      </Border>
      <ControlTemplate.Triggers>
            <EventTrigger RoutedEvent="Opened">
                  <BeginStoryboard>
                        <Storyboard TargetProperty="HorizontalOffset">
                              <DoubleAnimation From="0" To="5" Duration="0:0:0.1" />
                        </Storyboard>
                  </BeginStoryboard>
            </EventTrigger>
       </ControlTemplate.Triggers>
</ControlTemplate>

答案 1 :(得分:0)

经过几个小时的谷歌搜索后,我尝试了这里提供的解决方案 https://social.msdn.microsoft.com/Forums/vstudio/en-US/10d2ecbf-9e6e-4414-b57e-79dd02e0944e/changing-style-of-tooltip-in-textbox

它有效!

创建的工具提示样式

<ToolTip x:Key="ErrorToolTip" 
         Placement="Right" 
         Background="Red" 
         Foreground="White" 
         BorderThickness="0" 
         DataContext="{Binding Path=PlacementTarget, RelativeSource={RelativeSource Self}}">
    <ToolTip.Content>
        <Binding Path="(Validation.Errors)[0].ErrorContent"/>
    </ToolTip.Content>
    <ToolTip.Triggers>
        <EventTrigger RoutedEvent="ToolTip.Opened">
            <BeginStoryboard>
                <Storyboard TargetProperty="HorizontalOffset">
                    <DoubleAnimation From="0" To="5" Duration="0:0:0.2" />
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </ToolTip.Triggers>
</ToolTip>

并将Style.Triggers更改为

    <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter Property="ToolTip" Value="{StaticResource ErrorToolTip}" />
        </Trigger>
    </Style.Triggers>

需要做更多样式,但现在还可以。