Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Caliburn.Micro返回在激活时调用WinRT不工作_C#_Windows Runtime_Windows Phone 8.1_Caliburn.micro_Caliburn - Fatal编程技术网

C# Caliburn.Micro返回在激活时调用WinRT不工作

C# Caliburn.Micro返回在激活时调用WinRT不工作,c#,windows-runtime,windows-phone-8.1,caliburn.micro,caliburn,C#,Windows Runtime,Windows Phone 8.1,Caliburn.micro,Caliburn,此问题特定于Windows Phone 8.1(WinRT);它也可能适用于Windows 8.1。我正在使用Caliburn.Micro 2.0.1 在我的ViewModel的激活中我检查一个项目是否是数据库,如果不是,我想导航回上一页。 最简单的解决方案是在OnActivate方法中调用GoBack(这在Windows Phone 8.0中有效): 要导航到我调用的视图模型,请执行以下操作: _navigationService.NavigateToViewModel<MyViewMo

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

在我的ViewModel的
激活中
我检查一个项目是否是数据库,如果不是,我想导航回上一页。

最简单的解决方案是在
OnActivate
方法中调用
GoBack
(这在Windows Phone 8.0中有效):

要导航到我调用的视图模型,请执行以下操作:

_navigationService.NavigateToViewModel<MyViewModel>(_param);
有没有更好的方法返回?为什么
GoBack
不能在
OnActivate
中工作?有没有办法让它在激活状态下工作?

您可以使用

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

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

它起作用了!谢谢你能解释一下它为什么起作用吗。是异步线程还是UI线程?显然,当您当前在WP8.1中导航并尝试在那里导航时,WP8.1中存在问题。这似乎是caliburn.micro中的一个bug。代码使用Dispatcher将导航调用置于当前执行代码的后面。
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();
}
Execute.OnUIThreadAsync(() => /* navigationCode */);