WPF 文本框错误验证 Validation.ErrorTemplate

3 篇文章 0 订阅

前端:

1.错误模板ValidationContent.xaml

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ControlTemplate x:Key="ValidationToolTipTemplate">
        <Border x:Name="Root"
                Margin="5,0,0,0"
                Opacity="0"
                Padding="0,0,20,20"
                RenderTransformOrigin="0,0">
            <Border.RenderTransform>
                <TranslateTransform x:Name="xform"
                                    X="-25" />
            </Border.RenderTransform>
            <VisualStateManager.VisualStateGroups>
                <VisualStateGroup x:Name="OpenStates">
                    <VisualStateGroup.Transitions>
                        <VisualTransition GeneratedDuration="0" />
                        <VisualTransition GeneratedDuration="0:0:0.2"
                                          To="Open">
                            <Storyboard>
                                <DoubleAnimation Duration="0:0:0.2"
                                                 To="0"
                                                 Storyboard.TargetProperty="X"
                                                 Storyboard.TargetName="xform">
                                    <DoubleAnimation.EasingFunction>
                                        <BackEase Amplitude=".3"
                                                  EasingMode="EaseOut" />
                                    </DoubleAnimation.EasingFunction>
                                </DoubleAnimation>
                                <DoubleAnimation Duration="0:0:0.2"
                                                 To="1"
                                                 Storyboard.TargetProperty="Opacity"
                                                 Storyboard.TargetName="Root" />
                            </Storyboard>
                        </VisualTransition>
                    </VisualStateGroup.Transitions>
                    <VisualState x:Name="Closed">
                        <Storyboard>
                            <DoubleAnimation Duration="0"
                                             To="0"
                                             Storyboard.TargetProperty="Opacity"
                                             Storyboard.TargetName="Root" />
                        </Storyboard>
                    </VisualState>
                    <VisualState x:Name="Open">
                        <Storyboard>
                            <DoubleAnimation Duration="0"
                                             To="0"
                                             Storyboard.TargetProperty="X"
                                             Storyboard.TargetName="xform" />
                            <DoubleAnimation Duration="0"
                                             To="1"
                                             Storyboard.TargetProperty="Opacity"
                                             Storyboard.TargetName="Root" />
                        </Storyboard>
                    </VisualState>
                </VisualStateGroup>
            </VisualStateManager.VisualStateGroups>
            <FrameworkElement.Effect>
                <DropShadowEffect  BlurRadius="11"
                                   ShadowDepth="6"
                                   Opacity="0.4" />
            </FrameworkElement.Effect>
            <Border Background="#FFDC000C"
                    BorderThickness="1"
                    BorderBrush="#FFBC000C">
                <TextBlock Foreground="White"
                           MaxWidth="250"
                           Margin="8,4,8,4"
                           TextWrapping="Wrap"
                           Text="{Binding [0].ErrorContent}"
                           UseLayoutRounding="false" />
            </Border>
        </Border>
    </ControlTemplate>

    <Style TargetType="validationContent:ValidationContent">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate>
                    <Border  BorderBrush="#FFDB000C"
                             BorderThickness="1"
                             x:Name="root">
                        <ToolTipService.ToolTip>
                            <ToolTip x:Name="validationTooltip"
                                     Placement="Right"
                                     PlacementTarget="{Binding RelativeSource={RelativeSource TemplatedParent}}"
                                     Template="{StaticResource ValidationToolTipTemplate}" />
                        </ToolTipService.ToolTip>
                        <Grid Background="Transparent"
                              HorizontalAlignment="Right"
                              Height="12"
                              Width="12"
                              Margin="1,-4,-4,0"
                              VerticalAlignment="Top">
                            <Path Data="M 1,0 L6,0 A 2,2 90 0 1 8,2 L8,7 z"
                                  Fill="#FFDC000C"
                                  Margin="1,3,0,0" />
                            <Path Data="M 0,0 L2,0 L 8,6 L8,8"
                                  Fill="#FFDC000C"
                                  Margin="1,3,0,0" />
                        </Grid>
                    </Border>
                    <ControlTemplate.Triggers>
                        <MultiDataTrigger>
                            <MultiDataTrigger.Conditions>
                                <Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type AdornedElementPlaceholder}}, Path= AdornedElement.IsKeyboardFocusWithin, Mode=OneWay}"
                                           Value="True" />
                                <Condition Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type AdornedElementPlaceholder}}, Path= AdornedElement.(Validation.HasError), Mode=OneWay}"
                                           Value="True" />
                            </MultiDataTrigger.Conditions>
                            <Setter TargetName="validationTooltip"
                                    Property="IsOpen"
                                    Value="True" />
                        </MultiDataTrigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

2.ValidationContent

public class ValidationContent : Control
    {
        public ValidationContent()
        {
            DefaultStyleKey = typeof(ValidationContent);
        }
    }

3.模板绑定

  <!--textbox ErrorTemplate-->
    <ControlTemplate x:Key="ErrorTemplate">
        <AdornedElementPlaceholder>
            <ctTextbox:ValidationContent />
        </AdornedElementPlaceholder>
    </ControlTemplate>

4.给textbox设置错误模板

<!--ErrorTextBox Style, With Border-->
    <Style TargetType="TextBox" BasedOn="{StaticResource TextBoxStyle}" x:Key="ErrorTemplateTextboxStyle">
        <Setter Property="Validation.ErrorTemplate" Value="{DynamicResource ErrorTemplate}" />
    </Style>

效果

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值