在键盘焦点和鼠标悬停的工具提示中显示IDataErrorInfo错误

时间:2022-02-08 20:24:25

I have a TextBox which shows IDataErrorInfo validation information via a ToolTip by using this style:

我有一个TextBox,它使用这种样式通过ToolTip显示IDataErrorInfo验证信息:

<Style x:Key="EntityPropertyTextBoxErrorStyle" TargetType="{x:Type TextBox}"  
       BasedOn="{StaticResource {x:Type TextBox}}">
    <Setter Property="Validation.ErrorTemplate">
        <Setter.Value>
            <ControlTemplate>
                <!-- this gets rid of all adornment INCLUDING THE DEFAULT RED BORDER -->
                <AdornedElementPlaceholder />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter Property="ToolTip" 
                Value="{Binding RelativeSource={RelativeSource Self},
                Path=(Validation.Errors)[0].ErrorContent}"/>
            <Setter Property="Background" Value="MistyRose" />
        </Trigger>
    </Style.Triggers>
</Style>

Now I want the ToolTip to show on keyboard focus as well.

现在我希望ToolTip也能在键盘焦点上显示。

1 个解决方案

#1


0  

The best solution I found was to use a Popup instead of a ToolTip:

我找到的最佳解决方案是使用Popup而不是ToolTip:

<ControlTemplate x:Key="ErrorTemplate">
    <StackPanel>
        <AdornedElementPlaceholder x:Name="ControlWithError" />
        <Popup PlacementTarget="{Binding ElementName=ControlWithError}" Placement="Top">
            <Popup.IsOpen>
                <MultiBinding Converter="{StaticResource AtLeastOneTrueConverter}">
                    <Binding Path="AdornedElement.IsMouseOver"
                             ElementName="ControlWithError" Mode="OneWay" />
                    <Binding Path="AdornedElement.IsKeyboardFocusWithin"
                             ElementName="ControlWithError" Mode="OneWay" />
                </MultiBinding>
            </Popup.IsOpen>
            <Border BorderThickness="1">
                <TextBlock Text="{Binding 
                                  AdornedElement.(Validation.Errors)[0].ErrorContent,
                                  ElementName=ControlWithError}"
                            Background="White" 
                            FontSize="8" />
            </Border>
        </Popup>
    </StackPanel>
</ControlTemplate>
<Style x:Key="EntityPropertyTextBoxErrorStyle" TargetType="{x:Type TextBox}"
       BasedOn="{StaticResource {x:Type TextBox}}">
    <Setter Property="Validation.ErrorTemplate" Value="{StaticResource ErrorTemplate}" />
    <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter Property="Background" Value="MistyRose" />
        </Trigger>
    </Style.Triggers>
</Style>

#1


0  

The best solution I found was to use a Popup instead of a ToolTip:

我找到的最佳解决方案是使用Popup而不是ToolTip:

<ControlTemplate x:Key="ErrorTemplate">
    <StackPanel>
        <AdornedElementPlaceholder x:Name="ControlWithError" />
        <Popup PlacementTarget="{Binding ElementName=ControlWithError}" Placement="Top">
            <Popup.IsOpen>
                <MultiBinding Converter="{StaticResource AtLeastOneTrueConverter}">
                    <Binding Path="AdornedElement.IsMouseOver"
                             ElementName="ControlWithError" Mode="OneWay" />
                    <Binding Path="AdornedElement.IsKeyboardFocusWithin"
                             ElementName="ControlWithError" Mode="OneWay" />
                </MultiBinding>
            </Popup.IsOpen>
            <Border BorderThickness="1">
                <TextBlock Text="{Binding 
                                  AdornedElement.(Validation.Errors)[0].ErrorContent,
                                  ElementName=ControlWithError}"
                            Background="White" 
                            FontSize="8" />
            </Border>
        </Popup>
    </StackPanel>
</ControlTemplate>
<Style x:Key="EntityPropertyTextBoxErrorStyle" TargetType="{x:Type TextBox}"
       BasedOn="{StaticResource {x:Type TextBox}}">
    <Setter Property="Validation.ErrorTemplate" Value="{StaticResource ErrorTemplate}" />
    <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter Property="Background" Value="MistyRose" />
        </Trigger>
    </Style.Triggers>
</Style>