WP7 - Использование раскадровки, определенной в Application.Resources - PullRequest
6 голосов
/ 11 января 2011

В моем Application.Resources определено следующее Storyboard.

<Application.Resources>
  <!--Storyboard animation for fading out a UI element-->
  <Storyboard x:Key="FadeOutAnimation">
    <DoubleAnimation From="1"
                     To="0"
                     Duration="0:0:0.25"
                     Storyboard.TargetProperty="Opacity"
                     AutoReverse="False" />
  </Storyboard>
</Application.Resources>

В коде позади я использую это для затухания некоторых TextBlock с, когда пользователь нажимает на них.

// Get the storyboard from application resources
Storyboard sb = (Storyboard)App.Current.Resources["FadeOutAnimation"];
// Setup the animation target for fade out
Storyboard.SetTarget( sb.Children.ElementAt( 0 ) as DoubleAnimation, myTextBlock );
// Set the animation completed handler
sb.Completed += ( s, e1 ) => {
  // Stop the Storyboard
  sb.Stop();
  // Hide the TextBlock
  myTextBlock.Visibility = Visibility.Collapsed;
};
// Start the Storyboard
sb.begin();

Вопрос в том, нужно ли мне каким-то образом отцепить myTextBlock от цели DoubleAnimation?

Если да, как мне это сделать?

Причина, по которой я спрашиваю, состоит в том, что меня беспокоит ссылка на этот TextBlock, пока он не будет использован снова.

Спасибо за вашу помощь!

Ответы [ 2 ]

12 голосов
/ 11 января 2011

Мы не всегда должны использовать Xaml при слабом освещении, если он мешает нам: -

  public static AnimationHelper
  {
       public static void FadeOutAndCollapse(UIElement target)
       {
           DoubleAnimation da = new DoubleAnimation();
           da.From = 1.0;
           da.To = 0.0;
           da.Duration = TimeSpan.FromSeconds(0.25);
           da.AutoReverse = false;

           StoryBoard.SetTargetProperty(da, new PropertyPath("Opacity"));
           StoryBoard.SetTarget(da, target);

           StoryBoard sb = new StoryBoard();
           sb.Children.Add(da);

           EventHandler eh = null;
           eh = (s, args) =>
           {
                target.Visiblity = Visibility.Collapsed;
                sb.Stop();
                sb.Completed -= eh;
           }
           sb.Completed += eh;

           sb.Begin();
       }
}

С этим на месте вы можете исчезнуть и свернуть любой элемент интерфейса с помощью: -

AnimationHelper.FadeOutAndCollapse(myTextBox);

Я был склонен удалить From = 1.0, чтобы сделать его более общим, чтобы элементы с более низкой начальной непрозрачностью внезапно не мигали до полной непрозрачности перед исчезновением.

0 голосов
/ 11 января 2011

Не беспокойтесь о свисающих ссылках на легкие элементы пользовательского интерфейса;они будут собирать мусор, когда больше нет ссылок.Ваша более насущная проблема заключается в том, что одна раскадровка используется для нескольких текстовых объектов, и если они перекрываются, это приведет к неправильной работе.

Например, если вы запустите одну анимацию, а затем запустите другую, они будутоба останавливаются одновременно, потому что есть только одна раскадровка, и ваш обработчик вызывает остановку.Либо свяжите отдельную раскадровку с каждым текстовым элементом в XAML, либо создайте новую раскадровку в коде для каждой анимации, которую вы хотите сделать.

Кроме того, если вы собираетесь использовать одну раскадровку, вам следуетосторожно удалите обработчик завершенных событий, потому что в настоящее время вы будете продолжать его накапливать, и старые обработчики будут вызываться после повторного завершения раскадровки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...