在WPF中为Validation.ErrorTemplate添加故事板

时间:2014-12-15 14:25:01

标签: wpf validation storyboard

我正试图为ErrorTemplates的淡入和淡出设置动画,以免因太快发生而过多地吓坏我的用户。我想出的是下面的代码(不起作用)。我猜ErrorTemplate无法访问控件上附加的Validation.HasError属性。我还在DataTrigger上尝试Validation.HasError绑定self,但这也不起作用。

<ControlTemplate x:Key="ValidationTemplate">
    <ControlTemplate.Triggers>
        <Trigger Property="Validation.HasError" Value="True">
            <Trigger.EnterActions>
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation AutoReverse="true"
                                         Duration="0:0:0.5"
                                         RepeatBehavior="3x"
                                         Storyboard.TargetName="border"
                                         Storyboard.TargetProperty="Opacity"
                                         To="0.6" />
                    </Storyboard>
                </BeginStoryboard>
            </Trigger.EnterActions>
        </Trigger>
    </ControlTemplate.Triggers>
    <Border x:Name="border"
            BorderBrush="Red"
            BorderThickness="1"
            CornerRadius="2"
            Opacity="0.0">
        <AdornedElementPlaceholder Margin="-1" />
    </Border>
</ControlTemplate>

- 更新 我发现另一个不那么通用但很好的方法是通过使用visual statemanager实现ValidationStates可视状态组来重新设置控件。 http://msdn.microsoft.com/en-us/library/ms752068%28v=vs.110%29.aspx

1 个答案:

答案 0 :(得分:2)

您使用DataTrigger开启了正确的轨道。

但是你需要绑定到装饰者的AdornedElement Validation.HasError属性:

<ControlTemplate x:Key="ValidationTemplate">
    <ControlTemplate.Triggers>
        <DataTrigger Binding="{Binding ElementName=adorner, 
                             Path=AdornedElement.(Validation.HasError)}" Value="True">
            <DataTrigger.EnterActions>
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation AutoReverse="true"
                                Duration="0:0:0.5"
                                RepeatBehavior="3x"
                                Storyboard.TargetName="border"
                                Storyboard.TargetProperty="Opacity"
                                To="0.6" />
                    </Storyboard>
                </BeginStoryboard>
            </DataTrigger.EnterActions>
        </DataTrigger>
    </ControlTemplate.Triggers>
    <Border x:Name="border" BorderBrush="Red" BorderThickness="1" CornerRadius="2"
        Opacity="0.0">
        <AdornedElementPlaceholder Margin="-1" x:Name="adorner" />
    </Border>
</ControlTemplate>