MVVMCross编程方式更改启动ViewModel

4

可移植类库定义了起始视图模型。这听起来通常很好,但我正在考虑以下问题。您是否已经编写了一个需要更改其起始屏幕/视图模型的iOS通用应用程序或Android应用程序。如果应用程序是手机,则默认视图模型为登录,但如果是平板电脑,则希望使用不同的视图模型作为启动。是否有一种覆盖或控制此功能的方法?

3个回答

4
请参见Wiki部分-https://github.com/MvvmCross/MvvmCross/wiki/Customising-using-App-and-Setup#custom-imvxappstart-这里有一个编程切换的示例:
如果需要更高级的启动逻辑,则可以使用自定义应用程序启动-例如。
public class CustomAppStart
    : MvxNavigatingObject
    , IMvxAppStart
{
    public void Start(object hint = null)
    {
        var auth = Mvx.Resolve<IAuth>();
        if (auth.Check())
        {
            ShowViewModel<HomeViewModel>();
        }
        else
        {
            ShowViewModel<LoginViewModel>();
        }
    }
}

这可以通过以下方式在应用程序中进行注册:
RegisterAppStart(new CustomAppStart());

2

在您的App类中,您可以注册一个AppStart,它是一个启动画面:

RegisterAppStart<SplashScreenViewModel>() 

在这个闪屏界面中,您可以接收一个验证是平板还是手机的服务。您需要创建一个插件来进行此验证。(有其他stackoverflow问题展示如何进行验证 / 如何检测设备是否为Android手机或Android平板?

public SplashScreenViewModel(ITabletVerificationService tabletVerificationService)

那么你只需要根据这项服务进行屏幕更改。
if(tabletVerificationService.IsTablet())
{
   ShowViewModel<TabletViewModel>
}
else
{
  ShowViewModel<LoginViewModel>
}

希望这有所帮助 =)

0

这是我对这种情况的实现,如果有帮助的话:

PCL:

public enum PlateformType
{
    Android,
    iPhone,
    WindowsPhone,
    WindowsStore
}

public interface IPlateformInfos
{
    PlateformType GetPlateformType();
}

public class CustomAppStart
: MvxNavigatingObject
, IMvxAppStart
{
    public void Start(object hint = null)
    {
        var plateformInfos = Mvx.Resolve<IPlateformInfos>();
        var plateformType = plateformInfos.GetPlateformType();
        switch (plateformType)
        {
            default:
                ShowViewModel<MenuViewModel>();
                break;
            case PlateformType.WindowsPhone:
            case PlateformType.WindowsStore:
                ShowViewModel<FirstViewModel>();
                break;
        }
    }
}

PCL App.cs:

RegisterAppStart(new CustomAppStart());

用户界面(例如:WindowsPhone):

public class PlateformInfos : IPlateformInfos
{
    public PlateformType GetPlateformType()
    {
        return PlateformType.WindowsPhone;
    }
}

UI Setup.cs:

protected override void InitializeFirstChance()
{
    Mvx.RegisterSingleton<IPlateformInfos>(new PlateformInfos());
    base.InitializeFirstChance();
}

非常简单的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接