如何以编程方式添加和删除位图效果的故事板到ContentControl

本文关键字:的故事 ContentControl 位图 删除 编程 方式 添加 | 更新日期: 2023-09-27 18:10:33

我有以下未完成的行为。请注意,TransitionElement基本上是一个ContentControl。

我想创建两个故事板,使用BlurBitmapEffect来模糊和取消模糊控件。

如果ContentControl Enabled属性设置为false,我想添加故事板并开始模糊。

如果Enabled设置为true,我想运行一个故事板,它可以消除控件的模糊,一旦完成就会删除两个故事板,有效地删除任何位图效果。

class ContentControlBehavior : Behavior<TransitionElement>
{
    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.IsEnabledChanged += AssociatedObject_IsEnabledChanged;
    }
    protected override void OnDetaching()
    {
        AssociatedObject.IsEnabledChanged -= AssociatedObject_IsEnabledChanged;
        base.OnDetaching();
    }
    void AssociatedObject_IsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        if ((bool)e.NewValue == false)
        {
            //Blur
        }
        else
        {
            //UnBlur and remove storyboards and any bitmap effects.
        }
    }
}

当我锁定和解锁我的应用程序时,我正在这样做。

我发现通过带有样式的XAML对图形性能有巨大的影响。然后我在下面发现了一些笔记。所以我想为什么不应用这些故事板,然后将它们全部删除。

小心使用WPF位图效果。在我写这篇文章时,WPF位图效果在软件模式下呈现。任何适用的对象效果也将在软件中呈现。位图效果不应该适用于大型视觉效果。同样,效果的动画属性会降低性能。此时,我建议您使用位图使用相对较小的可视UI对象比如按钮,文本框等等。可以随意制作动画效果,但是同样,我推荐相对较小的、微妙的动画。

我刚刚注意到BitmapEffect是贬值和效果是一个使用。

如何以编程方式添加和删除位图效果的故事板到ContentControl

如果您不想在unblur

结束时删除故事板,这里有一个解决方案

假设TransitionElement是一种FrameworkElement,下面是一个示例。

class ContentControlBehavior : Behavior<TransitionElement>
{
    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.IsEnabledChanged += AssociatedObject_IsEnabledChanged;
        // add effect to element
        BlurEffect effect = new BlurEffect() { Radius = 0 };
        AssociatedObject.Effect = effect;
    }
    protected override void OnDetaching()
    {
        AssociatedObject.IsEnabledChanged -= AssociatedObject_IsEnabledChanged;
        base.OnDetaching();
        //remove the effect
        AssociatedObject.Effect = null;
    }
    void AssociatedObject_IsEnabledChanged(object sender, DependencyPropertyChangedEventArgs e)
    {
        if ((bool)e.NewValue == false)
        {
            //Blur
            BlurEffect effect = AssociatedObject.Effect as BlurEffect;
            effect.BeginAnimation(BlurEffect.RadiusProperty, new DoubleAnimation(10, TimeSpan.FromSeconds(0.5)));
        }
        else
        {
            //UnBlur
            BlurEffect effect = AssociatedObject.Effect as BlurEffect;
            effect.BeginAnimation(BlurEffect.RadiusProperty, new DoubleAnimation(0, TimeSpan.FromSeconds(0.25)));
        }
    }
}
在上面的例子中,

调用BeginAnimation有效地从目标属性中删除了之前的动画,但是最后一个动画仍然存在,但这是在效果上的,并且会随着行为的分离而被删除。