C# CoreDispatcher.HasThreadAccess“;“打破改变”;

C# CoreDispatcher.HasThreadAccess“;“打破改变”;,c#,windows-runtime,mvvmcross,C#,Windows Runtime,Mvvmcross,我正在接管使用MvvmCross.vNext开发的应用程序。 在尝试使用MvvmCross.V3更新它时,我发现了以下突破性的更改:在MainViewModel的构造函数中,我们显示了LoginViewModel(ShowViewModel())。 它在vNext中运行良好。 但是在V3中,LoginView不会显示。 经过long搜索后,我发现在MvxStoreMainThreadDispatcher.RequestMainThreadAction中添加了以下代码: if (_

我正在接管使用MvvmCross.vNext开发的应用程序。
在尝试使用MvvmCross.V3更新它时,我发现了以下突破性的更改:在MainViewModel的构造函数中,我们显示了LoginViewModel(ShowViewModel())。 它在vNext中运行良好。
但是在V3中,LoginView不会显示。
经过long搜索后,我发现在MvxStoreMainThreadDispatcher.RequestMainThreadAction中添加了以下代码:

        if (_uiDispatcher.HasThreadAccess)
        {
            action();
            return true;
        }
他对我的麻烦负责。
如果我把它注释掉,我的应用程序会像以前一样工作,但我想这段代码是因为某些原因而存在的…
你有什么建议吗?
我可以在不更改MvvmCross源代码的情况下强制执行前面的行为吗?
我应该重构代码以不同方式处理LoginView吗?
提前感谢您的评论。
菲利普

在尝试使用MvvmCross.V3更新它时,我发现了以下突破性的更改:在MainViewModel的构造函数中,我们显示了LoginViewModel(ShowViewModel())。它在vNext中运行良好

我认为您的构造函数导航在任何MvvmCross版本的多个平台上都会中断。老实说,我认为你很幸运它以前能工作

问题在于视图模型是在视图事件期间构造(或定位)的,例如
ViewDidLoad
OnNavigatedTo
、以及
OnCreate
——这些事件通常是 在“页面转换”期间调用

要解决此问题,您需要将登录导航移出构造函数

你如何做到这一点取决于你的应用程序

  • 如果您确实需要Home->Login backstack,那么您可以触发一些异步或时间延迟,或者您可以触发一些其他视图事件,例如
    ViewDidDisplay

  • 如果您不需要这个backback,那么我通常实现这类事情的方法是使用定制的
    IMvxAppStart
    ——类似于:

    public class AppStart
        : MvxNavigatingObject
        , IMvxAppStart      
    {
        public void Start(object hint = null)
        {
            var authService = Mvx.Resolve<IMySerice>();
            if (authService.IsLoggedIn)
            {
                ShowViewModel<HomeViewModel>();
            }
            else
            {
                ShowViewModel<LoginViewModel>();
            }
        }
    }
    

您能否提供一些关于如何/何时导航到该登录的上下文/代码?请记下最后一条评论-将回答soonHi Stuart,实际上,如果您在ctor中调用ShowViewModel,您将看到vNExt和Vee Three Philippe之间的区别
RegisterAppStart(new AppStart());