验证装饰器不会在动画中完全消失
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 为您提供所有帮助!伊恩以上是关于验证装饰器不会在动画中完全消失的主要内容,如果未能解决你的问题,请参考以下文章