WPF不透明度动画集控件IsEnabled=false

WPF不透明度动画集控件IsEnabled=false,wpf,animation,opacity,isenabled,Wpf,Animation,Opacity,Isenabled,我试图创建一个动画控件,根据提示(按空格键)更改不透明度 动画本身工作正常。基于按键,不透明度设置动画,控件进入视图。我将动画放在包含其余内容的网格控件上 问题是:动画完成后,网格的IsEnabled属性仍然为“false”,即使我手动(从代码隐藏)将其设置为true。该命令不会引发异常,但实际上也不会更改属性 当我再次运行相同的动画,但反向运行时,该值实际上变为“true”。但当然,在那一刻,它已经消失了 void Initialize() { // fade animation st

我试图创建一个动画控件,根据提示(按空格键)更改不透明度

动画本身工作正常。基于按键,不透明度设置动画,控件进入视图。我将动画放在包含其余内容的网格控件上

问题是:动画完成后,网格的IsEnabled属性仍然为“false”,即使我手动(从代码隐藏)将其设置为true。该命令不会引发异常,但实际上也不会更改属性

当我再次运行相同的动画,但反向运行时,该值实际上变为“true”。但当然,在那一刻,它已经消失了

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;
        }
    }
}
[编辑] 通过一些额外的调试,我发现是动画在淡入时主动将enabled设置为false,在淡出时将其设置为true,这与我希望它执行的操作完全相反

[编辑2]
当我完全抛弃动画,简单地将可见性更改为“隐藏”或“从隐藏”时,会遇到完全相同的问题。它在我将其隐藏时启用,在我将其可见时禁用

DependencyProperties具有与之关联的优先级,其中动画在列表中处于较高的位置

  • 产权制度强制
  • 活动动画或具有保持行为的动画
  • 局部值
  • TemplatedParent模板属性
  • 隐式风格
  • 样式触发器
  • 模板触发器
  • 风格设定者
  • 默认(主题)样式
  • 继承自父母
  • 依赖项属性元数据的默认值
默认情况下,动画的FillBehavior为HoldEnd,这意味着它们保持动画结束时的值。所以在你的例子中,你试图改变IsEnabled的值,但是它的优先级更高。以下是您可以解决此问题的方法:

将ExitAction添加到IsEnabled触发器以停止情节提要,防止动画继续断言其在动画结束时的值,以便可以应用本地值样式。此选项的好处是不必重复样式(如#1所示),同时也不必反转动画(如#2所示)


有关备份信息的更多信息和链接,请访问

这是viewmodels的一个问题。更准确地说:更高级别的viewmodel同时禁用了更高级别的控件。这就是为什么不可能启用这个较低级别的问题。

您的实际问题是什么?“IsEnabled”拒绝成为现实。动画效果很好,但我的所有活动都没有。谢谢你的回复。我的代码和那个示例之间有一些区别。我的动画实际上不是从IsEnabled触发器开始的,而是从viewmodel上的属性开始的。此外,问题似乎源于我在0.0不透明度上启动控件,这会自动禁用控件。因此,如果我理解正确,您的动画将在代码中触发。如果是这样,仍然可以在动画中添加触发器,以设置答案中解释的属性,从而可以在代码中设置IsEnabled。我现在完全删除了情节提要动画,只是将可见性从可见切换到隐藏,然后再切换回来。因此,即使不使用故事板或不透明度,它仍然启用了块。我发现了这个问题。谢谢你的回复,杰瑞,它帮助我缩小了原因。没问题,很高兴你找到了原因。使用viewmodels可能会导致您在一段时间内搜索类似的问题。在这种情况下,有人帮忙总是很好的:)。