2015-06-15 3 views
2

КонтекстАнимационные методы, упрощение и ремонт

Я своего рода новое в анимации WPF вещи, но я играл с библиотекой или два, и я «была» анимации, который я использовал с окном управления в WPF, это пример этого метода, имейте в виду, что этот метод работает:

public void AnimateFadeWindow(object sender, double opacity, double period) 
    { 
     //Tab item is a enw tab item (the sender is casted to this type.) 

     Window win = (Window)sender; 

     win.Opacity = 0; 

     //using the doubleanimation class, animation is a new isntancem use the parameter opacity and set the period to a timespan. 
     DoubleAnimation animation = new DoubleAnimation(opacity, TimeSpan.FromSeconds(period)); 

     //begin the animation on the object. 
     win.BeginAnimation(Window.OpacityProperty, animation); 
    } 

Проблема

Как я уже говорил ранее, этот код работает, то вероятностный lem с этим кодом, конечно, он подходит только для элемента управления Window, он не будет работать с другими элементами управления, например TabItem, Button или любым другим элементом управления, для которого я хотел использовать его, поэтому я «Модернизировал» мой метод и это мой ТЕКУЩИЙ метод:

public void AnimateFade(object sender, double opacity, double period) 
    { 
     //using the doubleanimation class, animation is a new isntancem use the parameter opacity and set the period to a timespan. 
     DoubleAnimation animation = new DoubleAnimation(opacity, TimeSpan.FromSeconds(period)); 

     Object obj = sender.GetType(); 

     if (obj is TabItem) 
     { 
      TabItem tab = (TabItem)sender; 
      tab.BeginAnimation(TabItem.OpacityProperty, animation); 
     } 
     else if (obj is Label) 
     { 
      Label lab = (Label)sender; 
      lab.BeginAnimation(Label.OpacityProperty, animation); 
     } 
     else if (obj is Window) 
     { 
      Window win = (Window)sender; 

      win.Opacity = 0; 
      win.BeginAnimation(Window.OpacityProperty, animation); 
     } 
    } 

Этот метод не работает. Я действительно не знаю, что я здесь делаю неправильно, поэтому я подумал, может ли кто-нибудь помочь.

ТАКЖЕ, есть ли более простой способ сделать это, используя что-то вроде класса PropertyInfo или класса отражения?

Спасибо Stack.

ответ

2

Ваш вопрос не имеет ничего общего с Animation проблемами .The это вы сравниваете sender.Type в то время как вы должны сравнить sender себя т.е. использования if (sender is TabItem) вместо if (obj is TabItem).

Кроме того, Там нет необходимости сравнивать отправителя с TabItem, Lable, Window и т.д. один за другим, они все UIElements! и С UIElement реализует IAnimatable, вам просто нужно бросить sender к UIElement и у вас есть общий метод, который применяет анимацию для любого элемента управления:

public void AnimateFade(object sender, double opacity, double period) 
    { 
     UIElement element = (UIElement)sender; 
     element.Opacity = 0; 
     DoubleAnimation animation = new DoubleAnimation(opacity, TimeSpan.FromSeconds(period)); 
     element.BeginAnimation(UIElement.OpacityProperty, animation); 
    } 
+0

Awesome, я не знаю, что я мог вернуться назад к UiElements и использования, что вместо , это довольно интересно. – Method

Смежные вопросы