Bezdepbonusu7Программирование: статьи и ответы

Вопрос

.NET WPF Window FadeIn и FadeOut Animation

Автор вопроса: c0D3l0g1cОтветов: 1

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

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

animationwpfwindow

Ответы

Ответ 1 · рейтинг 6 · MrDosu

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

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы