【问题标题】:Doing something after WP8 app bar has been hidden隐藏 WP8 应用栏后的操作
【发布时间】:2014-06-06 23:53:54
【问题描述】:

我正在为应用栏图标按钮实现我自己的弹出菜单(类似于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();
}

主要问题是动画在应用程序栏隐藏之前开始。结果,弹出菜单在那之后跳跃了一点。应用栏完全隐藏后如何运行动画?

【问题讨论】:

  • 操作系统隐藏appbar的动画总是在固定的时间完成。也许您可以测量它并让计时器在开始动画之前等待一段时间。或者,您可以将延迟作为动画的一部分来代替计时器。
  • @SJD,如果应用栏被隐藏,我们会在底部获得额外的空间。当应用栏消失时,整个布局因此重新计算,弹出菜单连同其下的控件一起向下移动。或许,对这种效果更好的描述是,弹出菜单的 Top 坐标增加了隐藏后应用栏的高度。
  • @disklosr,使用计时器并硬编码时间值是个坏主意。我们需要一个通用的解决方案。
  • @TecMan 我知道这一点,但我想不出任何其他解决方案。当应用栏位于视图的顶部而不是视图的一部分时,您的解决方案(正在重新计算的视图的高度)可能不起作用。另外,你确定动画结束后重新计算完成了吗?
  • @disklosr,我的应用栏不是半透明的,所以它不在其他控件之上。

标签: silverlight animation windows-phone-8 popupmenu application-bar


【解决方案1】:

动画完成后尝试隐藏应用栏。

 storyboard.Completed += storyboard_Completed;


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

【讨论】:

  • 在我的一个测试中,我使用了这个——但在我需要隐藏弹出菜单的情况下。在我们打开它的情况下,它看起来很丑,因为首先弹出菜单和动画一起出现,然后才隐藏应用栏。同样的“跳跃效果”。
【解决方案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();
    }
}

旧答案 - 不起作用 相信你可以订阅ApplicationBar的StateChanged event,然后开始你的故事。

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

【讨论】:

  • 你仔细阅读文档了吗?事件描述如下:“当用户通过单击省略号打开或关闭应用程序栏时发生。”请参阅 - 单击省略号。我如何使用它来满足我的需求?
  • 我必须说我不欣赏反对票。我没有说它会起作用,我说我认为它会起作用。我无法测试,但看起来它可能会起作用。答案包括所有可以帮助您的活动部件。我已经用我能够测试的东西更新了答案。
猜你喜欢
  • 2014-03-18
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 2014-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多