验证装饰器不会在动画中完全消失

Posted

技术标签:

【中文标题】验证装饰器不会在动画中完全消失【英文标题】:Validation adorner does not completely disappear in Animation 【发布时间】:2010-03-03 21:23:50 【问题描述】:

我有一个 WPF 窗口,其中包含一个 ContentPresenter,其高度和宽度默认设置为 0。 当用户单击按钮时,我运行动画将 ContentPresenter 的高度和宽度属性转换为 896,1024(实际上它在增长的同时也进行了 3 次旋转),这一切都很好......

用户控件的 DataContext 实现了 IDataErrorInfo,如果用户没有点击“我已阅读并理解这些健康与安全说明”复选框,则复选框周围会显示一个红色边框...

我的问题是,如果用户单击“取消”,并且我运行将高度和宽度缩小回 0,0 的动画,则 UserControl 会根据需要缩小,但红色边框不会完全消失 - 它在我的窗口中间留下一个红色像素

有人知道我做错了什么吗?我假设“红色边框”只是 WPF 为我呈现的装饰器,所以我不知道如何改变这种行为......

非常感谢所有帮助!

更新 - 我尝试了 Abe 的出色建议,但不幸的是它没有奏效,但它确实让我尝试了其他东西......所以现在我(暂时)注释掉了“缩小”动画,只需在 KeyTime="0:0:0.9" 处将可见性设置为 Collapsed ... 当我按下取消键时,不到一秒钟后,UserControl 消失了,但红色的装饰器顽固地保留着:(

作为额外的信息(不确定是否相关?)显示在 ContentPresenter 中的 UserControl 还包含一个 ContentPresenter 来呈现 UserControl,其内部内容包含验证装饰器...

代码示例:

<Button
    Name="signInButton"
    Grid.Row="0" Grid.Column="0"
    Margin="30"
    HorizontalAlignment="Right" VerticalAlignment="Bottom"
    Style="StaticResource LargeButtonStyle" 
    Content="Sign In"
    Command="Binding SignInCommand">
    <Button.Triggers>
        <EventTrigger
            RoutedEvent="Button.Click">
            <BeginStoryboard
                Storyboard="DynamicResource openViewAnimation" />
        </EventTrigger>
    </Button.Triggers>
</Button>

<ContentPresenter
    Name="mainView"
    Grid.RowSpan="2" Grid.ColumnSpan="2"
    HorizontalAlignment="Center" VerticalAlignment="Center"
    Opacity="0.9"
    Content="Binding CurrentContent">
    <ContentPresenter.RenderTransform>
        <RotateTransform
            Angle="0" />
    </ContentPresenter.RenderTransform>
</ContentPresenter>

<Storyboard x:Key="closeViewAnimation">
    <DoubleAnimation
        Storyboard.TargetName="mainView" Storyboard.TargetProperty="Height"
        From="896" To="0" Duration="0:0:0.9"
        AutoReverse="False" RepeatBehavior="1x" />
    <DoubleAnimation
        Storyboard.TargetName="mainView" Storyboard.TargetProperty="Width"
        From="1024" To="0" Duration="0:0:0.9"
        AutoReverse="False" RepeatBehavior="1x" />
</Storyboard>

谢谢,伊恩

【问题讨论】:

再读一遍,你能清除ViewModel上的错误状态吗?或者这是因为一开始就无效而进行编辑的情况? 【参考方案1】:

如果您添加一个 ObjectAnimationUsingKeyFrames,在其他动画完成时将元素的 Visibility 设置为 Collapsed,则装饰器也会消失。

<Storyboard x:Key="closeViewAnimation">
    <DoubleAnimation
        Storyboard.TargetName="mainView" Storyboard.TargetProperty="Height"
        From="896" To="0" Duration="0:0:0.9"
        AutoReverse="False" RepeatBehavior="1x" />
    <DoubleAnimation
        Storyboard.TargetName="mainView" Storyboard.TargetProperty="Width"
        From="1024" To="0" Duration="0:0:0.9"
        AutoReverse="False" RepeatBehavior="1x" />
    <ObjectAnimationUsingKeyFrames 
        Storyboard.TargetName="mainView"
        Storyboard.TargetProperty="Visibility">
        <DiscreteObjectKeyFrame Value="x:Static Visibility.Collapsed" 
            KeyTime="0:0:0.9" />
    </ObjectAnimationUsingKeyFrames>
</Storyboard>

显然,您需要在 KeyTime 0 处为 openViewAnimation 执行反向操作。

【讨论】:

感谢 Abe - 不幸的是它没有用,所以我更新了这个问题,更详细地介绍了......还有更多想法吗?再次感谢,伊恩 我猜内部内容需要是设置为折叠的内容(可见性不会沿树继承)。因此,如果 AdornedElement 可见,则 Adorner 也将可见。 感谢您一直支持我!是的,我最终(根据您在上面问题 cmets 中的建议)在取消向导时删除了验证错误... +1 为您提供所有帮助!伊恩

以上是关于验证装饰器不会在动画中完全消失的主要内容,如果未能解决你的问题,请参考以下文章

十装饰器

python之循序渐进学习装饰器

Python装饰器完全解读

Python之第十八天的努力--装饰器初识

装饰器实现session登陆 验证功能

装饰器实现用户验证登录