none
在APP中多个Frame怎么处理后退按键 RRS feed

  • 问题

  • 在APP中的MainPage.xaml中又定义了一个frame。在APP.cs中订阅了SystemNavigationManager的BackRequested事件

    然后在BackRequested事件中使用

    var t=sender as frame;

    本来是想用sender来处理不能GoBack了就隐藏这个子Frame,发现这个参数没有值。哪该如何来处理?

    如果点击后退的话直接就返回开始菜单了

    下图中左滑的页面就是子Frame

    为毛这样用,应为默认的那些过度动画太丑 - -

    2016年9月6日 8:48

答案

  • 最终解决问题毫无违和感:

     /// <summary>
            /// childrenFrame导航开始前
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void childrenFrame_Navigating(object sender, NavigatingCancelEventArgs e)
            {
                childrenFrameCompositeTransform.TranslateX = 0;
                //1.设置childrenFrame导航进入动画
                EdgeUIThemeTransition inStoryoard = new EdgeUIThemeTransition();
                //2.只有在导航是新实例才执行动画
                if (e.NavigationMode == NavigationMode.New)
                {
                    #region 系统定义的边缘UI
                    //inStoryoard.Edge = EdgeTransitionLocation.Right;
                    //TransitionCollection tc = new TransitionCollection();
                    //tc.Add(inStoryoard);
                    //childrenFrame.ContentTransitions = tc;
                    #endregion
                    #region 自定义动画
                    childrenInDA.From = this.ActualWidth;
                    childrenInStoryboard.Begin();
                    #endregion
                }
            }

    1.使用Frame的Navigating和Navigated事件来控制开闭动画

     /// <summary>
            /// 导航结束
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void childrenFrame_Navigated(object sender, NavigationEventArgs e)
            {
                var tempPageE = e.Content as Page;
                switch (tempPageE.Tag.ToString())
                {
                    case "安全页面":
                        (childrenFrame.Content as SafePage).BackEvent += MainPage_BackEvent;
                        break;
                    default:
                        break;
                }
            }

    2.在所有需要的退出的动画的页面实现BackEvert委托

     public sealed partial class SafePage : Page
        {
            internal delegate void GoBackHandler();
            internal event GoBackHandler BackEvent;
    
            public SafePage()
            {
                this.InitializeComponent();
            }
        }

    3.在MainPage.cs中实现MainPage_BackEvent

     /// <summary>
            /// 实现各个页面定义的委托
            /// </summary>
            private void MainPage_BackEvent()
            {
                //1.设置退出动画的TO属性
                childrenOutDA.To = this.ActualWidth;
                //2.动画开始
                childrenOutStoryboard.Begin();
    
            }

    最后在Mainpage中注册

    /// <summary>
            /// MainPage载入
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void MainPage_Loaded(object sender, RoutedEventArgs e)
            {
                //1.注册后退管理
                SystemNavigationManager.GetForCurrentView().BackRequested += MainPage_BackRequested;
            }

     bool IsExit = false;
            /// <summary>
            /// 响应后退按钮
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private async void MainPage_BackRequested(object sender, BackRequestedEventArgs e)
            {
                if (childrenFrame.Content != null)
                {
                    e.Handled = true;
                    if (childrenFrame.CanGoBack)
                    {
                        childrenFrame.GoBack();
                    }
                    else
                    {
                        childrenOutDA.To = this.ActualWidth;
                        childrenOutStoryboard.Begin();
                    }
                }
                else
                {
                    if (e.Handled == false)
                    {
                        if (IsExit)
                        {
                            //1.退出APP
                            Application.Current.Exit();
                        }
                        else
                        {
                            IsExit = true;
                            e.Handled = true;
                            ExitTipTextBlock.Text = "再按一次(,,•∀•)ノ゛ByeBye";
                            ExitTipBorder.Visibility = Visibility.Visible;
                            await Task.Delay(1500);
                            IsExit = false;
                            ExitTipBorder.Visibility = Visibility.Collapsed;
                        }
                    }
                    else
                    {
    
                    }
                }
            }


    • 已标记为答案 Enious 2016年9月6日 11:26
    • 取消答案标记 Enious 2016年9月6日 12:13
    • 已标记为答案 Enious 2016年9月6日 13:45
    • 已编辑 Enious 2016年9月9日 14:51
    2016年9月6日 11:26

全部回复

  • 最好提供可以呈现问题的代码,因为不明白你所说的“子Frame”是什么意思。BackRequested是系统事件,它的sender当然不会有值,最好用代码来说明你的逻辑设计。
    • 已标记为答案 Enious 2016年9月6日 11:26
    • 取消答案标记 Enious 2016年9月6日 12:13
    2016年9月6日 9:08
  • https://yunpan.cn/cMNjtIncPAyaV  访问密码 158f

    麻烦帮我看下,子Frame其实就是我自己在MainPage中定义的一个Frame,

    2016年9月6日 10:00
  • 其实是有点懵逼,因为这里使用的是我新建的childrenFrame,把他显示出来后,我的逻辑是这个时候按后退应该是GoBack  childrenFrame的,不能GoBack了就把这个childrenFrame的Visibility设置为Collapsed,结果这里看GIF很清楚他是GoBack   RootFrame的,最核心的问题就是不知道该怎么处理显示childrenFrame时的后退逻辑,上文提到我打算使用SystemNavigationManager的BackRequested事件在APP.xaml.cs里做全局处理
    • 已编辑 Enious 2016年9月6日 10:08
    2016年9月6日 10:05
  • 最终解决问题毫无违和感:

     /// <summary>
            /// childrenFrame导航开始前
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void childrenFrame_Navigating(object sender, NavigatingCancelEventArgs e)
            {
                childrenFrameCompositeTransform.TranslateX = 0;
                //1.设置childrenFrame导航进入动画
                EdgeUIThemeTransition inStoryoard = new EdgeUIThemeTransition();
                //2.只有在导航是新实例才执行动画
                if (e.NavigationMode == NavigationMode.New)
                {
                    #region 系统定义的边缘UI
                    //inStoryoard.Edge = EdgeTransitionLocation.Right;
                    //TransitionCollection tc = new TransitionCollection();
                    //tc.Add(inStoryoard);
                    //childrenFrame.ContentTransitions = tc;
                    #endregion
                    #region 自定义动画
                    childrenInDA.From = this.ActualWidth;
                    childrenInStoryboard.Begin();
                    #endregion
                }
            }

    1.使用Frame的Navigating和Navigated事件来控制开闭动画

     /// <summary>
            /// 导航结束
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void childrenFrame_Navigated(object sender, NavigationEventArgs e)
            {
                var tempPageE = e.Content as Page;
                switch (tempPageE.Tag.ToString())
                {
                    case "安全页面":
                        (childrenFrame.Content as SafePage).BackEvent += MainPage_BackEvent;
                        break;
                    default:
                        break;
                }
            }

    2.在所有需要的退出的动画的页面实现BackEvert委托

     public sealed partial class SafePage : Page
        {
            internal delegate void GoBackHandler();
            internal event GoBackHandler BackEvent;
    
            public SafePage()
            {
                this.InitializeComponent();
            }
        }

    3.在MainPage.cs中实现MainPage_BackEvent

     /// <summary>
            /// 实现各个页面定义的委托
            /// </summary>
            private void MainPage_BackEvent()
            {
                //1.设置退出动画的TO属性
                childrenOutDA.To = this.ActualWidth;
                //2.动画开始
                childrenOutStoryboard.Begin();
    
            }

    最后在Mainpage中注册

    /// <summary>
            /// MainPage载入
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void MainPage_Loaded(object sender, RoutedEventArgs e)
            {
                //1.注册后退管理
                SystemNavigationManager.GetForCurrentView().BackRequested += MainPage_BackRequested;
            }

     bool IsExit = false;
            /// <summary>
            /// 响应后退按钮
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private async void MainPage_BackRequested(object sender, BackRequestedEventArgs e)
            {
                if (childrenFrame.Content != null)
                {
                    e.Handled = true;
                    if (childrenFrame.CanGoBack)
                    {
                        childrenFrame.GoBack();
                    }
                    else
                    {
                        childrenOutDA.To = this.ActualWidth;
                        childrenOutStoryboard.Begin();
                    }
                }
                else
                {
                    if (e.Handled == false)
                    {
                        if (IsExit)
                        {
                            //1.退出APP
                            Application.Current.Exit();
                        }
                        else
                        {
                            IsExit = true;
                            e.Handled = true;
                            ExitTipTextBlock.Text = "再按一次(,,•∀•)ノ゛ByeBye";
                            ExitTipBorder.Visibility = Visibility.Visible;
                            await Task.Delay(1500);
                            IsExit = false;
                            ExitTipBorder.Visibility = Visibility.Collapsed;
                        }
                    }
                    else
                    {
    
                    }
                }
            }


    • 已标记为答案 Enious 2016年9月6日 11:26
    • 取消答案标记 Enious 2016年9月6日 12:13
    • 已标记为答案 Enious 2016年9月6日 13:45
    • 已编辑 Enious 2016年9月9日 14:51
    2016年9月6日 11:26
  • 点击多次后退出动画竟然边进入动画,

    2016年9月6日 13:56