Делать что-то после того, как панель приложения WP8 была скрыта

Я нахожусь в процессе реализации моего собственного всплывающего меню для кнопок значков на панели приложения (что-то похожее на инструмент PhoneFlipMenu). Я использую вертикальную StackPanel для моего всплывающего окна, и мне нужно отображать его с анимацией, когда нажата соответствующая кнопка панели приложения. Код выглядит так:

private void appBarIconButtonList_Click(object sender, EventArgs e)
{
    ApplicationBar.IsVisible = false;
    AnimatePopupMenuListCommands(true);
}

private void AnimatePopupMenuListCommands(bool openMenu)
{
    PlaneProjection planeProjection = popupMenuListCommands.Projection as PlaneProjection;

    DoubleAnimation anima = new DoubleAnimation();
    if (openMenu)
    {
        anima.From = 90;
        anima.To = 0;
    }
    else
    {
        anima.From = 0;
        anima.To = 90;
    }
    anima.Duration = new Duration(TimeSpan.FromSeconds(0.1));

    Storyboard.SetTarget(anima, planeProjection);
    Storyboard.SetTargetProperty(anima, new PropertyPath(PlaneProjection.RotationXProperty));

    Storyboard storyboard = new Storyboard();
    storyboard.Children.Add(anima);
    storyboard.Begin();
}

Основная проблема заключается в том, что анимация начинается до того, как панель приложения будет скрыта. В результате всплывающее меню немного подпрыгивает после этого. Как запустить анимацию после того, как панель приложения была полностью скрыта?

2 ответа

Вы можете подождать, пока панель приложения будет скрыта, используя Dispatcher или DispatcherTimer. Вот пример использования Dispatcher:

private void ApplicationBarIconButton_OnClick(object sender, EventArgs e)
{
    ApplicationBar.IsVisible = false;
    WaitForAppBarThenShowMenu();
}

private void WaitForAppBarThenShowMenu()
{
    if (ApplicationBar.IsVisible)
    {
        Dispatcher.BeginInvoke(WaitForAppBarThenShowMenu);
    }
    else
    {
        AnimatePopupMenuListCommands();
    }
}

СТАРЫЙ ОТВЕТ - НЕ РАБОТАЕТ Я полагаю, что вы можете подписаться на событие StateChanged в ApplicationBar, а затем начать свою историю.

EventHandler<ApplicationBarStateChangedEventArgs> stateChanged = null;
stateChanged = (s,e) => 
{
    ApplicationBar.StateChanged -= stateChanged;
    AnimatePopupMenuListCommands(true);
};
ApplicationBar.StateChanged += stateChanged;
ApplicationBar.IsVisible = false;

Попробуйте скрыть панель приложения после завершения анимации.

 storyboard.Completed += storyboard_Completed;


    void storyboard_Completed(object sender, EventArgs e)
    {
        ApplicationBar.IsVisible = false;
    }
Другие вопросы по тегам