此问题特定于Windows Phone 8.1(WinRT);它也可能适用于Windows 8.1。我正在使用Caliburn.Micro 2.0.1
在我的ViewModel' OnActivate
中,我检查某个项目是否为数据库,如果不是,我想导航回上一页。 < / p>
简化解决方案只是在GoBack
方法中调用OnActivate
(这适用于Windows Phone 8.0):
INavigationService _navigationService;
protected override void OnActivate()
{
_item = GetItemFromDB();
if(_item == null)
{
_navigationService.GoBack()
}
}
要导航到我调用的视图模型:
_navigationService.NavigateToViewModel<MyViewModel>(_param);
但它不起作用,它会忽略GoBack
调用并停留在我不想查看的页面上。
当单步执行代码时,您可以看到GoBack
方法中调用NavigateToViewModel
代码;我希望这就是为什么它不起作用的原因(可能与排队问题有关?)。
我有一个非常&#34; hacky&#34; 解决方案涉及一个计时器(有效),但我真的很鄙视它,因为它很容易出现线程问题并有可能存在在NavigateToViewModel
调用期间调用(如果需要很长时间才能完成),这将再次无效:
protected override void OnActivate()
{
_item = GetItemFromDB();
if(_item == null)
{
DispatcherTimer navigateBackTimer = new DispatcherTimer();
navigateBackTimer.Interval = TimeSpan.FromMilliseconds(300);
navigateBackTimer.Tick += GoBackAfterNavigation;
navigateBackTimer.Start();
}
}
public void GoBackAfterNavigation(object sender, object e)
{
_navigationService.GoBack();
(sender as DispatcherTimer).Stop();
}
有更好的导航方式吗?为什么GoBack
的{{1}}工作不正常?有没有办法让它在OnActivate
中运行?
答案 0 :(得分:2)
您可以使用
Execute.OnUIThreadAsync(() => /* navigationCode */);
而不是在当前堆栈处理完成后立即对操作进行排队的计时器。