Caliburn.Micro Go Back在On Activate中调用不在WinRT中工作

时间:2014-12-19 09:43:07

标签: c# windows-runtime windows-phone-8.1 caliburn.micro caliburn

此问题特定于Windows Phone 8.1(WinRT);它也可能适用于Windows 8.1。我正在使用Caliburn.Micro 2.0.1

在我的ViewModel&#39; 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中运行?

1 个答案:

答案 0 :(得分:2)

您可以使用

Execute.OnUIThreadAsync(() => /* navigationCode */);

而不是在当前堆栈处理完成后立即对操作进行排队的计时器。