首页 文章

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

提问于
浏览
1

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

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

问题是:动画结束后,即使我手动(从代码隐藏)将其设置为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]当我完全抛弃动画时,我得到完全相同的问题,只是改变隐藏的可见性 . 当我将其隐藏时,它会启用,当我将其设为可见时禁用 .

2 回答

  • 1

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

    • property 制度强制

    • 活动动画或具有保持行为的动画 .

    • 本地值

    • TemplatedParent模板属性

    • 隐式风格

    • 样式触发器

    • 模板触发器

    • 样式制定者

    • 默认(主题)样式

    • 从父级继承

    • 依赖项属性元数据的默认值

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

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

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

  • 1

    事实证明这是viewmodels的一个问题 . 更确切地说:更高级别的视图模型同时禁用更高级别的控件 . 这就是为什么不可能启用这个较低级别的 .

相关问题