使用Validation.HasError覆盖Tooltip模板

时间:2014-10-30 14:02:32

标签: c# wpf validation

我看过的每个地方,我都找到了将ToolTip附加到Binding有Validation.HasError == true的控件的标准解决方案,但是没有显示如何完全覆盖ToolTip的模板,以便您可以,例如,仍然有自己的自定义主题覆盖所有工具提示的样式,但是当控件具有该特定条件时,您可以指定具有红色边框,红色透视背景和红色文本的模板。

标准解决方案是:

<Style x:Key="{x:Type FrameworkElement}" TargetType="FrameworkElement">
    <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors).CurrentItem.ErrorContent}"/>
        </Trigger>
    </Style.Triggers>
</Style>

有没有人知道如何扩展它来设置工具提示背景,边框和文字颜色而不覆盖基础ToolTip控件样式?请记住,我已经指定了这个来创建我自己的“主题”,所以如果可能的话我不想改变它。

3 个答案:

答案 0 :(得分:2)

是的,你可以这样做:

<Style x:Key="{x:Type FrameworkElement}" TargetType="FrameworkElement">
    <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter Property="ToolTip">
                <Setter.Value>
                    <ToolTip Content="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors).CurrentItem.ErrorContent}" Style="{StaticResource MyInheritedStyleForValidation}"/>
                </Setter.Value>
            </Setter>
        </Trigger>
    </Style.Triggers>
</Style>

MyInheritedStyleForValidation可能会覆盖您的主题样式。

答案 1 :(得分:2)

将ToolTip的DataContext设置为父控件:

<Style.Triggers>
    <Trigger Property="Validation.HasError" Value="True">
        <Setter Property="ToolTip">
            <Setter.Value>
                <ToolTip Foreground="White"
                         Background="Black"
                         DataContext="{Binding Path=PlacementTarget, RelativeSource={RelativeSource Self}}"
                         Content="{Binding Path=(Validation.Errors)[0].ErrorContent}"/>
            </Setter.Value>
        </Setter>
    </Trigger>
</Style.Triggers>

答案 2 :(得分:0)

这可以修复工具提示内容。

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

他风格的工具提示模板:

<Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ToolTip}">                      
                                    <!--Display the text-->
                                    <Label Background="Transparent" 
                                         BorderThickness="0" 
                                         VerticalAlignment="Center"
                                         Grid.Column="1"                                            
                                         Content="{Binding Tag, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Control}, AncestorLevel=2}}"                                            
                                         BorderBrush="Transparent"/>
                </ControlTemplate>
            </Setter.Value>
 </Setter>