2013-04-29 33 views
0

我想创建一个动画控件,它根据cue(按空间)来改变不透明度。WPF不透明度动画设置控件IsEnabled = false

动画本身正常工作。基于按键,不透明动画和控制进入视野。我把动画放在一个包含其余内容的网格控件上。

问题是这样的:动画完成后,网格的IsEnabled属性仍然为“假”,即使手动(从代码隐藏)将其设置为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; 
     } 
    } 
} 

[编辑] 通过一些额外的调试我发现,那就是积极集启用为false淡入动画,并将其设置为true,当它淡出,这是完全相反的我想要它做什么。

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

+0

你真正的问题是什么? – Terry 2013-04-29 08:10:06

+0

“IsEnabled”拒绝成为真实。动画是有效的,但我的事件都没有。 – 2013-04-29 08:12:26

回答

0

发现它竟然是用的ViewModels一个问题。更确切地说:更高级别的视图模型同时禁用更高级别的控件。这就是为什么无法启用这个较低级别的原因。

1

DependencyProperties具有与它们相关的优先级,其中动画在列表中高居不下。

  • 房产系统强制
  • 活动的动画,或动画与保持行为。
  • 本地值
  • TemplatedParent模板属性
  • 隐式的
  • 风格触发
  • 模板触发
  • 风格制定者
  • 默认(主题)风格从母体继承
  • 默认值来自依赖属性元数据

默认情况下,动画具有HoldEnd的FillBehavior,这意味着它们停留在动画结束的值。所以在你的情况下,你试图改变IsEnabled的值,但它的优先级更高。以下是您可以解决的问题:

向您的IsEnabled触发器中添加ExitAction以停止故事板,防止动画继续声明其在动画结束时的值,以便可以应用本地值样式。此选项具有无需重复样式(如#1中所示)的优点,同时也不必倒转动画(如#2中所示)。

更多信息和备份信息的链接可以在here

+0

感谢您的回复。我的代码和这个例子有一些区别。我的动画实际上并不是从IsEnabled触发器开始,而是从视图模型的属性开始。此外,问题似乎源于我开始控制0.0不透明度的事实,该控件会自动禁用该控件。 – 2013-04-29 08:35:14

+0

所以如果我理解正确,你的动画是在代码中触发的。如果是这样,仍然可以在代码中添加一个触发器来设置答案中解释的属性,以便可以在代码中设置IsEnabled。 – Terry 2013-04-29 08:45:39

+0

我现在完全删除了故事板动画,只是将可见性从可见性切换到隐藏和返回。所以它仍然阻止启用,即使没有使用故事板或不透明度。 – 2013-04-29 08:52:20