.NET WPF Window FadeIn и FadeOut Animation - PullRequest
       24

.NET WPF Window FadeIn и FadeOut Animation

3 голосов
/ 22 сентября 2010

Ниже приведены фрагменты кода анимации 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 () корректно анимируется, затем окно заканчивается с уродливым черным фоном.

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

1 Ответ

6 голосов
/ 22 сентября 2010

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

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

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

...