0

我有以下未完成的行为。请注意,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 已被贬值,而 Effect 是可以使用的。

4

1 回答 1

1

如果您不想在 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 有效地从目标属性中删除了任何先前的动画,但是最后一个仍然存在,但那是在效果上并且将在行为分离时被删除。

于 2014-06-28T04:52:37.617 回答