我正在使用 Caliburn Micro 2 beta 2 创建WinPhone 8.1应用。该应用程序工作正常,但我在导航中的后退按钮有问题:导航到另一个视图工作,但如果我按下模拟器上的硬件后退按钮,一旦我导航后返回到上一页,我& #39; m回到OS开始屏幕,好像导航堆栈是空的。在所有代码示例中,我都可以发现它在我的VM上实现GoBack
方法足以通过约定将其绑定到导航系统,所以我似乎没有遗漏任何东西。如果我在GoBack
方法上设置一个断点,但它根本没有被击中,这表明问题应该与绑定相关联。
这是一个完整的repro空解决方案:http://1drv.ms/1gLAVil。这个应用程序是一种具有2个视图的CM骨架,因此您可以从一个视图导航到另一个视图然后再按下。
除了通常的CM管道(在App.xaml.cs
中找到)之外,我的相关代码只是:
``` public bool CanGoBack { 得到{return _navigation.CanGoBack; } }
public void GoBack() { _navigation.GoBack(); } ```
其中_navigation
是在我的所有视图模型的基类的构造函数中注入的INavigationService
的标准实现。我尝试了两种我知道的导航方法,但是(正如预期的那样)没有任何变化:方法NavigateToViewModel<OtherViewModel>()
(它有一个重载接收一个对象参数,其类型应该与目标VM的属性类型相匹配)名为Parameter
,这是在视图模型之间传递复杂对象的快捷方式)和UriFor<OtherViewModel>().Navigate()
(使用.WithParam
之前通过Navigate()
指定的可选,简单可序列化参数构建类似URI的字符串{{1}} 1}})。
有人可以提出解决方案吗?
答案 0 :(得分:0)
如果您想返回单击后退按钮,则需要覆盖硬件按钮事件:
HardwareButtons.BackPressed += HardwareButtons_BackPressed;
void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e)
{
Frame rootFrame = Window.Current.Content as Frame;
if(rootFrame != null && rootFrame.CanGoBack)
{
rootFrame.GoBack();
e.Handled = true;
}
}
确保将e.Handled设置为true。