1

我正在尝试创建一个动画控件,该控件根据提示(按空格)更改不透明度。

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

问题是这样的:动画完成后,网格的 IsEnabled 属性仍然是“false”,即使我手动(从代码隐藏)将其设置为 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] 当我完全放弃动画时,我遇到了完全相同的问题,只需将可见性更改为隐藏。当我将其设为隐藏时它启用,当我将其设为可见时禁用。

4

2 回答 2

1

DependencyProperties 具有与其关联的优先级,其中动画在列表中排名靠前。

  • 属性系统强制
  • 活动动画,或具有 Hold 行为的动画。
  • 当地价值
  • TemplatedParent 模板属性
  • 隐式风格
  • 风格触发器
  • 模板触发器
  • 样式设置器
  • 默认(主题)样式
  • 继承自父母
  • 依赖属性元数据的默认值

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

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

更多信息和备份信息的链接可以在这里找到

于 2013-04-29T08:26:06.393 回答
1

原来是视图模型有问题。更准确地说:更高级别的视图模型同时禁用了更高级别的控制。这就是为什么无法启用这个较低级别的原因。

于 2013-04-29T09:16:29.657 回答