C# CoreDispatcher.HasThreadAccess“;“打破改变”;
我正在接管使用MvvmCross.vNext开发的应用程序。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.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>(); } } }
RegisterAppStart(new AppStart());