есть у меня меню, когда нажимаешь кнопочку в нем, то старое съезжает влево, а новое приезжает справа.
private void slideRightToLeftMenu(UIElement left, UIElement right)
{
right.SetValue(MarginProperty, new Thickness(innerGrid.ActualWidth, 0, 0, 0));
if (!topMenuGrid.Children.Contains(right))
topMenuGrid.Children.Add(right);
right.Visibility = Visibility.Visible;
Storyboard storyBoard = new Storyboard();
ThicknessAnimation anim1 = new ThicknessAnimation(new Thickness(-topMenuButt.ActualWidth - 201, 0, 0, 0), new Duration(TimeSpan.FromMilliseconds(300)));
Storyboard.SetTargetProperty(anim1, new PropertyPath("Margin"));
Storyboard.SetTarget(anim1, left);
ThicknessAnimation anim2 = new ThicknessAnimation(new Thickness(0), new Duration(TimeSpan.FromMilliseconds(300)));
Storyboard.SetTargetProperty(anim2, new PropertyPath("Margin"));
Storyboard.SetTarget(anim2, right);
storyBoard.Children.Add(anim1);
storyBoard.Children.Add(anim2);
storyBoard.Completed += new EventHandler(slideLeftRemoveMenu_Completed);
storyBoard.Begin();
}
private void slideLeftRemoveMenu_Completed(object sender, EventArgs e)
{
UIElement el = (UIElement)Storyboard.GetTarget((sender as ClockGroup).Children[0].Timeline);
if (topMenuGrid.Children.Contains(el))
topMenuGrid.Children.Remove(el);
RaiseEvent(new RoutedEventArgs(frmMain.EndMenuAnimationEvent));
}
ну и юзается так:
private void btnLoadMyAlbums_Click(object sender, RoutedEventArgs e)
{
slideRightToLeftMenu(mainMenu, albumMenu);
slideToLeftElements(albumsListView);
this.EndMenuAnimation += new RoutedEventHandler(frmMain_EndMenuAnimationEvent_loadAlbums);
viewState = ViewState.Albums;
}
private void frmMain_EndMenuAnimationEvent_loadAlbums(object sender, RoutedEventArgs e)
{
this.EndMenuAnimation -= new RoutedEventHandler(frmMain_EndMenuAnimationEvent_loadAlbums);
albums = dataAlbumService.getAllAlbums();
albumsListView.ItemsSource = albums;
albums.CollectionChanged += new System.Collections.Specialized.NotifyCollectionChangedEventHandler(albums_CollectionChanged);
}
теперь собственно вопросы:
после завершения анимации необходимо проделать некие действия, поэтому я привязываюсь к событию завершения анимации storyBoard.Completed и потом raise'ю свое событие EndMenuAnimationEvent, которое отлавливаю и после этого делаю эти действия.
1. я сам вижу, что это как-то через жопу, как это делается нормально? может паттерн программирования какой или что
2. действия начинают делаться то еще до завершения анимации, то как полагается после, т.е. иногда кнопки еще не до конца уезжают, анимация еще не до конца завершилась, а уже анимация зависает, потому что начинают делаться эти действия, потом оживает и уже уезжают до конца. почему так происходит не совсем ясно
Ответить
|