我正在尝试创建一个动画控件,根据提示(按空格)更改不透明度。
动画本身正常运作。基于按键,不透明度动画和控制进入视野。我将动画放在包含其余内容的网格控件上。
问题在于:动画完成后,即使我手动(从代码隐藏)将其设置为true,网格的IsEnabled属性仍为“false”。该命令不会引发异常,但实际上也不会更改属性。
当我再次运行相同的动画但反转时,该值实际上变为“真”。但当然,在那一刻它已经逐渐淡出。
void Initialize()
{
// fade animation storyboard
FadeAnimation = new DoubleAnimation(0.0, 1.0,
new Duration(TimeSpan.FromSeconds(0.7)))
{ FillBehavior = FillBehavior.HoldEnd };
FadeStoryboard.Children.Add(FadeAnimation);
Storyboard.SetTargetName(FadeAnimation, grid.Name);
Storyboard.SetTargetProperty(FadeAnimation,
new PropertyPath(Grid.OpacityProperty));
}
// flipping the animation around
void InputManager_KeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.Space)
{
if (!ViewModel.IsActive)
{
FadeAnimation.From = grid.Opacity;
FadeAnimation.To = 1.0;
FadeStoryboard.Begin(this);
ViewModel.IsActive = true;
}
else if (ViewModel.IsActive)
{
FadeAnimation.From = grid.Opacity;
FadeAnimation.To = 0.0;
FadeStoryboard.Begin(this);
ViewModel.IsActive = false;
}
}
}
[编辑] 通过一些额外的调试,我发现它是在淡入时主动设置为false的动画,并在淡出时将其设置为true,这与我希望它做的完全相反。
[编辑2] 当我完全放弃动画时,我遇到了完全相同的问题,只是改变了隐藏的可见性。当我将其隐藏时,它会启用,当我将其设为可见时禁用。
答案 0 :(得分:1)
DependencyProperties具有与之关联的优先级,其中动画在列表中较高。
默认情况下,动画的FillBehavior为HoldEnd,这意味着它们保持动画结束的值。所以在你的情况下,你试图改变IsEnabled的值,但是它被保持在更高的优先级。以下是您可以解决的问题:
将一个ExitAction添加到IsEnabled触发器以停止故事板,防止动画继续断言它在动画结束时具有的值,以便可以应用本地值样式。此选项的好处是不必重复样式(如#1),同时也不必反转动画(如#2中所示)。
有关备用信息的更多信息和链接,请访问here
答案 1 :(得分:1)
结果是viewmodels存在问题。更确切地说:更高级别的视图模型同时禁用更高级别的控件。这就是为什么不可能启用这个较低级别的。