C# Windows Phone 8.1上的MvvmCross向后导航

C# Windows Phone 8.1上的MvvmCross向后导航,c#,windows-phone-8,mvvmcross,C#,Windows Phone 8,Mvvmcross,我有一个基于Windows Phone Silverlight 8.1 MVVMCross 3.5.1的应用程序,可以在视图之间完美地前后导航 要向前导航,我使用 MvxViewModel.ShowViewModel() API。这很有效。要向后导航,我只需使用手机上的后退按钮,这也很有效 我正在制作一个与Windows Phone 8.1相同的应用程序,以使用一些钱包功能。导航前进按预期工作。然而,当我点击手机上的后退按钮时,应用程序退出 这是适用于Windows Phone 8.1应用程序的

我有一个基于Windows Phone Silverlight 8.1 MVVMCross 3.5.1的应用程序,可以在视图之间完美地前后导航

要向前导航,我使用

MvxViewModel.ShowViewModel()

API。这很有效。要向后导航,我只需使用手机上的后退按钮,这也很有效

我正在制作一个与Windows Phone 8.1相同的应用程序,以使用一些钱包功能。导航前进按预期工作。然而,当我点击手机上的后退按钮时,应用程序退出

这是适用于Windows Phone 8.1应用程序的App.xaml.cs的全部内容

 /// <summary>
    /// Provides application-specific behavior to supplement the default Application class.
    /// </summary>
    public sealed partial class App : Application
    {
        private TransitionCollection transitions;

        /// <summary>
        /// Initializes the singleton application object.  This is the first line of authored code
        /// executed, and as such is the logical equivalent of main() or WinMain().
        /// </summary>
        public App()
        {
            this.InitializeComponent();
            this.Suspending += this.OnSuspending;
        }

        /// <summary>
        /// Invoked when the application is launched normally by the end user.  Other entry points
        /// will be used when the application is launched to open a specific file, to display
        /// search results, and so forth.
        /// </summary>
        /// <param name="e">Details about the launch request and process.</param>
        protected override void OnLaunched(LaunchActivatedEventArgs e)
        {

#if DEBUG
        if (System.Diagnostics.Debugger.IsAttached)
        {
            this.DebugSettings.EnableFrameRateCounter = true;
        }
#endif

        Frame rootFrame = Window.Current.Content as Frame;

        // Do not repeat app initialization when the Window already has content,
        // just ensure that the window is active
        if (rootFrame == null)
        {
            // Create a Frame to act as the navigation context and navigate to the first page
            rootFrame = new Frame();

            // TODO: change this value to a cache size that is appropriate for your application
            rootFrame.CacheSize = 1;

            if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
            {
                // TODO: Load state from previously suspended application
            }

            // Place the frame in the current Window
            Window.Current.Content = rootFrame;
        }

        if (rootFrame.Content == null)
        {
            // When the navigation stack isn't restored navigate to the first page,
            // configuring the new page by passing required information as a navigation
            // parameter

            var setup = new Setup(rootFrame);
            setup.Initialize();



            //// Removes the turnstile navigation for startup.
            //if (rootFrame.ContentTransitions != null)
            //{
            //    this.transitions = new TransitionCollection();
            //    foreach (var c in rootFrame.ContentTransitions)
            //    {
            //        this.transitions.Add(c);
            //    }
            //}

            //rootFrame.ContentTransitions = null;
            //rootFrame.Navigated += this.RootFrame_FirstNavigated;

            //// When the navigation stack isn't restored navigate to the first page,
            //// configuring the new page by passing required information as a navigation
            //// parameter
            //if (!rootFrame.Navigate(typeof(MainPage), e.Arguments))
            //{
            //    throw new Exception("Failed to create initial page");
            //}

            var starter = Cirrious.CrossCore.Mvx.Resolve<Cirrious.MvvmCross.ViewModels.IMvxAppStart>();
            starter.Start();
        }

        // Ensure the current window is active
        Window.Current.Activate();
    }

    /// <summary>
    /// Restores the content transitions after the app has launched.
    /// </summary>
    /// <param name="sender">The object where the handler is attached.</param>
    /// <param name="e">Details about the navigation event.</param>
    private void RootFrame_FirstNavigated(object sender, NavigationEventArgs e)
    {
        var rootFrame = sender as Frame;
        rootFrame.ContentTransitions = this.transitions ?? new TransitionCollection() { new NavigationThemeTransition() };
        rootFrame.Navigated -= this.RootFrame_FirstNavigated;
    }

    /// <summary>
    /// Invoked when application execution is being suspended.  Application state is saved
    /// without knowing whether the application will be terminated or resumed with the contents
    /// of memory still intact.
    /// </summary>
    /// <param name="sender">The source of the suspend request.</param>
    /// <param name="e">Details about the suspend request.</param>
    private void OnSuspending(object sender, SuspendingEventArgs e)
    {
        var deferral = e.SuspendingOperation.GetDeferral();

        // TODO: Save application state and stop any background activity
        deferral.Complete();
    }
}
//
///提供特定于应用程序的行为以补充默认应用程序类。
/// 
公共密封部分类应用程序:应用程序
{
私有转换集合转换;
/// 
///初始化singleton应用程序对象。这是编写代码的第一行
///已执行,因此是main()或WinMain()的逻辑等价物。
/// 
公共应用程序()
{
this.InitializeComponent();
this.Suspending+=this.OnSuspending;
}
/// 
///当最终用户正常启动应用程序时调用。其他入口点
///将在启动应用程序以打开特定文件时使用,以显示
///搜索结果等等。
/// 
///有关启动请求和过程的详细信息。
仅启动受保护的覆盖无效(启动ActivatedEventArgs e)
{
#如果调试
if(System.Diagnostics.Debugger.IsAttached)
{
this.DebugSettings.EnableFrameRateCounter=true;
}
#恩迪夫
Frame rootFrame=Window.Current.Content作为Frame;
//当窗口已经有内容时,不要重复应用程序初始化,
//只需确保窗口处于活动状态
if(rootFrame==null)
{
//创建一个框架作为导航上下文并导航到第一页
rootFrame=新框架();
//TODO:将此值更改为适合应用程序的缓存大小
rootFrame.CacheSize=1;
如果(例如,PreviousExecutionState==ApplicationExecutionState.Terminated)
{
//TODO:从先前挂起的应用程序加载状态
}
//将框架放置在当前窗口中
Window.Current.Content=rootFrame;
}
if(rootFrame.Content==null)
{
//导航堆栈未还原时,请导航到第一页,
//通过将所需信息作为导航传递来配置新页面
//参数
var设置=新设置(根框架);
setup.Initialize();
////删除用于启动的旋转栅门导航。
//if(rootFrame.ContentTransitions!=null)
//{
//this.transitions=新TransitionCollection();
//foreach(rootFrame.ContentTransitions中的var c)
//    {
//本.过渡.添加(c);
//    }
//}
//rootFrame.ContentTransitions=null;
//rootFrame.Navigated+=this.rootFrame_FirstNavigated;
////导航堆栈未还原时,请导航到第一页,
////通过将所需信息作为导航传递来配置新页面
////参数
//if(!rootFrame.Navigate(typeof(MainPage),e.Arguments))
//{
//抛出新异常(“未能创建初始页面”);
//}
var starter=Cirrious.CrossCore.Mvx.Resolve();
starter.Start();
}
//确保当前窗口处于活动状态
Window.Current.Activate();
}
/// 
///在应用程序启动后恢复内容转换。
/// 
///附加处理程序的对象。
///有关导航事件的详细信息。
private void RootFrame_FirstNavigated(对象发送方,NavigationEventArgs e)
{
var rootFrame=发送方作为帧;
rootFrame.ContentTransitions=this.transitions??新的TransitionCollection(){new NavigationThemeTransition()};
rootFrame.Navigated-=this.rootFrame_FirstNavigated;
}
/// 
///在挂起应用程序执行时调用。应用程序状态已保存
///不知道应用程序是否会随内容一起终止或恢复
///记忆仍然完好无损。
/// 
///挂起请求的源。
///有关暂停请求的详细信息。
暂停时的私有void(对象发送方,SuspendingEventArgs e)
{
var deleral=e.SuspendingOperation.getdeleral();
//TODO:保存应用程序状态并停止任何后台活动
延迟。完成();
}
}

我遗漏了什么?

Windows Phone 8.1在导航方面做了一些事情,使其无法正常工作

本期包含了大量关于此主题的信息:

可以用作基类的代码是:

public abstract class BaseView<T> : MvxWindowsPage<T> where T : MvxViewModel
{
    private ICommand _goBackCommand;

    public ICommand GoBackCommand
    {
        get { return _goBackCommand ?? (_goBackCommand = new MvxCommand(GoBack, CanGoBack)); }
        set { _goBackCommand = value; }
    }

    protected BaseView()
    {
        NavigationCacheMode = NavigationCacheMode.Required;
        Loaded += (s, e) => {
            HardwareButtons.BackPressed += HardwareButtonsBackPressed;
        };

        Unloaded += (s, e) => {
            HardwareButtons.BackPressed -= HardwareButtonsBackPressed;
        };
    }

    private void HardwareButtonsBackPressed(object sender, BackPressedEventArgs e)
    {
        if (GoBackCommand.CanExecute(null))
        {
            e.Handled = true;
            GoBackCommand.Execute(null);
        }
    }

    public virtual void GoBack()
    {
        if (Frame != null && Frame.CanGoBack) Frame.GoBack();
    }

    public virtual bool CanGoBack()
    {
        return Frame != null && Frame.CanGoBack;
    }

    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        if (e.NavigationMode == NavigationMode.New)
            ViewModel = null;

        base.OnNavigatedTo(e);
    }
}
public抽象类BaseView:MvxWindowsPage其中T:MvxViewModel
{
专用ICommandu goBackCommand;
公共ICommand goback命令
{
获取{return}goBackCommand??(_goBackCommand=new MvxCommand(GoBack,CanGoBack));}
设置{u goBackCommand=value;}
}
受保护的BaseView()
{
NavigationCacheMode=NavigationCacheMode.必选;
加载+=(s,e)=>{
HardwareButtons.BackPressed+=HardwareButtons BackPressed;
};
卸载+=(s,e)=>{
HardwareButtons.BackPressed-=HardwareButtons BackPressed;
};
}
私有无效硬件按钮反压(对象发送器,反压EventTargets e)
{