Получение пользовательского элемента из события завершения анимации

#c# #wpf #animation #casting #uielement

#c# #wpf #Анимация #Кастинг #пользовательский элемент

Вопрос:

Из моего кода я хочу запустить анимацию для определенного UIElement , когда эта анимация закончится, я хотел бы выполнить некоторую другую обработку для этого UIElement . У меня возникли проблемы с пониманием того, как преобразовать AnimationClock объект, который я получаю в качестве отправителя события завершения анимации, в UIElement объект, на котором была выполнена анимация.

Вот код, который я использую для сборки и запуска анимации:

 DoubleAnimation FadeOutAnim = new DoubleAnimation(1, 0, TimeSpan.FromSeconds(.5));
FadeOutAnim.Completed  = new EventHandler(FadeOutAnim_Completed);

UIElement element = lstMessages.ItemContainerGenerator.ContainerFromItem(sender) as UIElement;
if(element != null)
   element.BeginAnimation(UIElement.OpacityProperty, FadeOutAnim);
  

И вот мое завершенное событие, к UIElement которому я снова хочу получить доступ.

 void FadeOutAnim_Completed(object sender, EventArgs e)
    {
        UIElement animation = sender; //This is an AnimationClock and I can't seem to figure out how to get my UIElement back.

    }
  

Любая помощь была бы высоко оценена.

Ответ №1:

Если обработчик бесполезен (я, например, не могу найти способ вернуть анимированный элемент обратно), вы могли бы просто вызвать другое событие, которое содержит эту информацию:

 private event EventHandler FadeAnimationCompleted;
private void OnFadeAnimationCompleted(object sender)
{
    var handler = FadeAnimationCompleted;
    if (handler != null)
        handler(sender, null);
}
  
 FadeAnimationCompleted  = new EventHandler(This_FadeAnimationCompleted);
FadeOutAnim.Completed  = (s, _) => OnAnimationCompleted(element);
  
 void This_FadeAnimationCompleted(object sender, EventArgs e)
{
    //Sender is the UIElement
}
  

Еще проще было бы выполнить прямой вызов метода в делегате:

 FadeOutAnim.Completed  = (s, _) => FadeAnimationCompleted(element);
  
 void FadeAnimationCompleted(UIElement element)
{
    //Meaningful code goes here.
}
  

Комментарии:

1. Спасибо, просто и великолепно.