2015-11-16 4 views
0

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

Ошибка:

Additional information: Value cannot be null.

Это код, который добавляет метод к EventHandler, и метод :

//Position the Notification 
      var workingArea = SystemParameters.WorkArea; 
      this.Left = (workingArea.Width - this.ActualWidth)/2; 

      //Create storyboard for animation 
      Loaded += animate; 
     } 
    }    
} 

public RoutedEventHandler animate(object sender, RoutedEventArgs e) 
{ 
    var workingArea = SystemParameters.WorkArea; 

    Storyboard sb = new Storyboard(); 
    var slide = new DoubleAnimation() 
    { 
     BeginTime = TimeSpan.FromSeconds(2), 
     Duration = TimeSpan.FromSeconds(1), 
     By = -100 
    }; 
    Storyboard.SetTarget(slide,this); 
    Storyboard.SetTargetName(this, "MyWindow"); 
    Storyboard.SetTargetProperty(slide,new PropertyPath("(Window.Top)")); 

    this.Top = workingArea.Height - this.ActualHeight; 
    return null; 
} 

Edit: Это все окна Code Behind, который должен обрабатывать анимации и позиционирование.

/// <summary> 
    /// Interaction logic for NotificationAll.xaml 
    /// </summary> 
    public partial class NotificationAll : Window 
    { 
     public NotificationAll() : base() 
     { 
      InitializeComponent(); 
     } 
     public new void Show() 
     { 
      //Ensure new notifications are placed above older ones 
      if (!Application.Current.Windows.Cast<Window>().Where(x => 
      x != this).Any(x => x.GetType().Name == "NotificationAll")) 
      { 
       this.Topmost = true; 
       base.Show(); 

       this.Owner = System.Windows.Application.Current.MainWindow; 

       //Position the Notification 
       var workingArea = SystemParameters.WorkArea; 
       this.Left = (workingArea.Width - this.ActualWidth)/2; 

       //Create storyboard for animation 
       Loaded += SlideFromBottom; 
      } 
     } 

     public void SlideFromBottom(object sender, RoutedEventArgs e) 
     { 
      MessageBox.Show("h"); 
      var workingArea = SystemParameters.WorkArea; 

      Storyboard sb = new Storyboard(); 
      var slide = new DoubleAnimation() 
      { 
       BeginTime = TimeSpan.FromSeconds(2), 
       Duration = TimeSpan.FromSeconds(1), 
       By = -100 
      }; 
      Storyboard.SetTarget(slide,this); 
      Storyboard.SetTargetName(this, "MyWindow"); 
      Storyboard.SetTargetProperty(slide,new PropertyPath("(Window.Top)")); 

      this.Top = workingArea.Height - this.ActualHeight; 
     } 

     /// <summary> 
     /// Close window once animation is complete 
     /// </summary> 
     /// <param name="sender"></param> 
     /// <param name="e"></param> 
     private void DoubleAnimationCompleted(object sender, EventArgs e) 
     { 
      if (!this.IsMouseOver) 
      { 
       this.Close(); 
      } 
     } 
    } 
+0

Отладчик должен указывать его на линию. Что это за линия? –

+0

@EmpereurAiman ​​Обновлено сообщение с тех пор, получил другую ошибку –

ответ

1

Ну, это довольно просто. Вы вызываете свой метод animate и присваиваете его результат событию Loaded. Метод animate всегда возвращает null в вашем случае. Если вы хотите, чтобы animate был обработчиком событий, вы не должны называть его, используя скобки. Вместо этого вы должны сделать Loaded += animate;
И у него должна быть правильная подпись: void animate(object sender, RoutedEventArgs e)

+0

И он должен иметь правильную подпись 'void animate (object sender, RoutedEventArgs e)' – Clemens

+0

Да, забыл об этом :) –

+1

Или используйте выражение лямбда: 'Loaded + = (o, e) => animate(); ' – Clemens

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