C# Windows Phone 8.1上的MvvmCross向后导航
我有一个基于Windows Phone Silverlight 8.1 MVVMCross 3.5.1的应用程序,可以在视图之间完美地前后导航 要向前导航,我使用 MvxViewModel.ShowViewModel() API。这很有效。要向后导航,我只需使用手机上的后退按钮,这也很有效 我正在制作一个与Windows Phone 8.1相同的应用程序,以使用一些钱包功能。导航前进按预期工作。然而,当我点击手机上的后退按钮时,应用程序退出 这是适用于Windows Phone 8.1应用程序的App.xaml.cs的全部内容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应用程序的
/// <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)
{