【问题标题】:Caliburn.Micro Go Back called in On Activate not working in WinRT在激活时调用的 Caliburn.Micro Go Back 在 WinRT 中不起作用
【发布时间】:2015-02-18 05:25:26
【问题描述】:

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

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

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

INavigationService _navigationService;
protected override void OnActivate()
{
    _item = GetItemFromDB();
    if(_item == null)
    {
       _navigationService.GoBack() 
    }
}

导航到我调用的视图模型:

_navigationService.NavigateToViewModel<MyViewModel>(_param);

但它不起作用,它忽略了GoBack 调用并停留在我不想查看的页面上。

单步执行代码时,您可以看到GoBack 代码在NavigateToViewModel 方法内部被调用;我希望这就是它不起作用的原因(可能与排队问题有关?)。

我有一个非常“hacky” 的解决方案,其中涉及一个计时器(有效),但我真的很鄙视它,因为它容易出现线程问题并且有可能在@987654329 期间被调用@ 调用(如果需要很长时间才能完成),这将再次不起作用:

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();
}

有没有更好的导航方式?为什么GoBackOnActivate 中不起作用?有没有办法让它在OnActivate 中工作?

【问题讨论】:

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


    【解决方案1】:

    你可以使用

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

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

    【讨论】:

    • 有效!谢谢!为什么会起作用,请您解释一下。是异步还是 UI 线程?
    • 显然,当您当前正在导航并尝试在那里导航时,WP8.1 中存在问题。这似乎是 caliburn.micro 中的一个错误。该代码使用 Dispatcher 将您的导航调用置于当前正在执行的代码之后。
    猜你喜欢
    • 1970-01-01
    • 2015-06-04
    • 2021-10-23
    • 2022-01-11
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    相关资源
    最近更新 更多