我有以下未完成的行为。请注意,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是贬值和效果是一个使用。
如果您不想在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有效地从目标属性中删除了之前的动画,但是最后一个动画仍然存在,但这是在效果上的,并且会随着行为的分离而被删除。