.NET WPF Window FadeIn и FadeOut Animation

Ниже приведены фрагменты кода анимации окон FadeIn и FadeOut:

// Create the fade in storyboard
fadeInStoryboard = new Storyboard();
fadeInStoryboard.Completed += new EventHandler(fadeInStoryboard_Completed);
DoubleAnimation fadeInAnimation = new DoubleAnimation(0.0, 1.0, new Duration(TimeSpan.FromSeconds(0.30)));
Storyboard.SetTarget(fadeInAnimation, this);
Storyboard.SetTargetProperty(fadeInAnimation, new PropertyPath(UIElement.OpacityProperty));
fadeInStoryboard.Children.Add(fadeInAnimation);

// Create the fade out storyboard
fadeOutStoryboard = new Storyboard();
fadeOutStoryboard.Completed += new EventHandler(fadeOutStoryboard_Completed);
DoubleAnimation fadeOutAnimation = new DoubleAnimation(1.0, 0.0, new Duration(TimeSpan.FromSeconds(0.30)));
Storyboard.SetTarget(fadeOutAnimation, this);
Storyboard.SetTargetProperty(fadeOutAnimation, new PropertyPath(UIElement.OpacityProperty));
fadeOutStoryboard.Children.Add(fadeOutAnimation);

Ниже приведены вспомогательные методы, запускающие анимацию:

/// <summary>
/// Fades the window in.
/// </summary>
public void FadeIn()
{
   // Begin fade in animation
   this.Dispatcher.BeginInvoke(new Action(fadeInStoryboard.Begin), DispatcherPriority.Render, null);
}

/// <summary>
/// Fades the window out.
/// </summary>
public void FadeOut()
{
   // Begin fade out animation
   this.Dispatcher.BeginInvoke(new Action(fadeOutStoryboard.Begin), DispatcherPriority.Render, null);
}

Код отлично работает, за исключением двух проблем:

  1. При FadeIn() окно начинается с уродливого черного фона, а затем корректно анимируется.
  2. Если FadeOut() анимируется правильно, окно заканчивается уродливым черным фоном.

Почему это происходит? Как мне сделать так, чтобы эта анимация работала плавно без задержек черного фона?


person c0D3l0g1c    schedule 22.09.2010    source источник


Ответы (1)


Вам нужно будет установить AllowsTransparency на true на Window, чтобы он вышел из полностью прозрачного.

К сожалению, это возможно только с WindowStyle=None, поэтому вам придется реализовать собственную строку заголовка.

Это приводит к некоторым неприятным проблемам с производительностью, поскольку окно больше не может отображаться аппаратно. Если вы пойдете по этому пути, я настоятельно рекомендую установить RenderOptions.ProcessRenderMode на RenderMode.SoftwareOnly (.NET 4.0 или выше) в потоке пользовательского интерфейса, чтобы получить приемлемую производительность в простых композициях.

person MrDosu    schedule 22.09.2010
comment
Привет, мистер Досу. Спасибо за ответ. Я использую настраиваемые окна WPF, поэтому свойство WindowStyle=None уже установлено. Установит RenderOptions.SoftwareOnly для повышения производительности. Я на VS 2010 .NET 4.0 :) - person c0D3l0g1c; 22.09.2010
comment
Многоуровневые окна (WindowStyle=None, AllowsTransparency=True, Background=Transparent) могут отображаться аппаратно в Windows Vista или более поздних версиях. - person Samuel Jack; 26.01.2011