Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.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
Navigation MvvmCross和复杂导航_Navigation_Xamarin_Mvvmcross - Fatal编程技术网

Navigation MvvmCross和复杂导航

Navigation MvvmCross和复杂导航,navigation,xamarin,mvvmcross,Navigation,Xamarin,Mvvmcross,我很难理解mvvmcross navigation在一些更复杂的情况下是如何工作的。让我们以应用程序为例,我们希望使用mvvmcross作为基础为WP7和Metro制作该应用程序。我们创建三个视图模型(FirstViewModel、SecondViewModel、ThirdVIewModel),用一些数据填充它们,并使用常规导航在它们之间移动(使用ShowViewModel()方法)。到目前为止,这工作得很好,我们希望在Windows Phone设备上实现这种导航,这是三个独立的视图,我们可以来

我很难理解mvvmcross navigation在一些更复杂的情况下是如何工作的。让我们以应用程序为例,我们希望使用mvvmcross作为基础为WP7和Metro制作该应用程序。我们创建三个视图模型(FirstViewModel、SecondViewModel、ThirdVIewModel),用一些数据填充它们,并使用常规导航在它们之间移动(使用ShowViewModel()方法)。到目前为止,这工作得很好,我们希望在Windows Phone设备上实现这种导航,这是三个独立的视图,我们可以来回导航

现在从Metro应用程序的角度来看,我们有更大的屏幕,通常在lanscape模式下使用,因此我们决定将这三个页面的内容显示为一个页面

这就是我看到的问题所在——因为两个版本的应用程序使用相同的核心和相同的视图模型层次结构——似乎不可能同时具有这种行为。从FirstViewModel到SecondViewModel的导航不适用于Metro版本的应用程序,因为我们实际上在第一个屏幕上,我们希望包含所有三个视图模型的所有数据。另一方面,我们不能将这三个视图模型放在更大的视图模型中,并将其用作单视图模型,因为这三个单独的视图模型以及常规导航在Windows Phone上非常适合我们


有没有办法使用mvvmcross提供这种非标准导航?如果是这样的话,是需要编写/添加一些简单的代码(我可能看不到),还是需要相当多的时间和编码才能实现这种功能的复杂代码

当然可以,不过您需要编写一些自定义类。如果为每个平台编写自定义演示者,则可以使用区域的概念,在这些区域中,视图可以指示它们希望显示的区域,以便在调用ShowViewModel时,自定义演示者可以检查相应视图是否请求了特定区域,并根据需要进行处理

看看Stuart Lodges n+1定制演示者。还有谷歌“MVVMCross region presenters”。你应该找到一些有用的材料

干杯,
Tristan

MvvmCross有不同的方法来更改其默认机制。 Wiki是一个很好的起点:

关于您的示例:

我的一个想法是创建一个MainViewModel,其中包含WindowsStore应用程序的所有三个视图模型

即使MainViewModel仅由Windows应用商店应用程序使用,您仍可以在核心项目中使用它。您可能希望以后在Android或iOS平板电脑应用程序中也使用它:

public class MainViewModel : MvxViewModel
{
    public FirstViewModel First { get; private set; }
    public SecondViewModel Second { get; private set; }
    public ThirdViewModel Third { get; private set; }

    public MainViewModel()
    {
          this.First = new FirstViewModel();
          this.Second = new SecondViewModel();
          this.Third = new ThirdViewModel();
     }
}
接下来,根据平台的不同,您需要导航到MainViewModel或FirstViewModel

在MvvmCross中很少有这样做的方法

一个选项是使用CustomAppStart,根据平台导航到初始视图模型

在核心库中:

 public class CustomAppStart
        : MvxNavigatingObject
        , IMvxAppStart
    {
        public void Start(object hint = null)
        {
           var platform == GetRunningPlatform();
           switch(platform)
           { 
              case Platform.WinStore:
                   ShowViewModel<MainViewModel>();
                   break;
              case Platform.WinPhone:
                   ShowViewModel<FirstViewModel>();
                   break;               
              ...    
        }
    }
公共类CustomAppStart
:MvxNavigatingObject
,IMvxAppStart
{
公共无效开始(对象提示=null)
{
var platform==GetRunningPlatform();
交换机(平台)
{ 
case Platform.WinStore:
ShowViewModel();
打破
case Platform.WinPhone:
ShowViewModel();
打破
...    
}
}
为了检测应用程序运行在哪个平台上,同样也有几种方法。 检查或了解MvvmLight的工作方式:

另一个想法是在每个平台上分别安装WinPhoneAppStart和WinStoreAppStart。请注意,在创建IMVX应用程序之前,需要注册自定义应用程序启动(IMvxAppStart)

在Windows应用商店应用程序中:

public class WinStoreAppStart : MvxNavigatingObject, IMvxAppStart
{
    public void Start(object hint = null)
    {
       ShowViewModel<MainViewModel>();   
    }  
}

public class Setup : MvxStoreSetup
{ 
     protected override IMvxApplication CreateApp()
     {
         Mvx.RegisterType(typeof(IMvxAppStart), typeof(WinStoreAppStart));
         return new Core.App();
     } 
}
公共类WinStoreAppStart:MvxNavigatingObject,IMvxAppStart
{
公共无效开始(对象提示=null)
{
ShowViewModel();
}  
}
公共类设置:MvxStoreSetup
{ 
受保护的覆盖IMvxApplication CreateApp()
{
注册表类型(typeof(IMvxAppStart),typeof(WinStoreAppStart));
返回新的Core.App();
} 
}
唷,我希望这对你有帮助。如果你需要更多信息,请告诉我

编辑:

如果这3个页面不代表起始主页,那么我的一个想法是使用自定义演示者:

在WinStore应用程序中,您可以捕获到FirstViewModel的导航,并创建MainViewModel

另一个想法是:


您可以拥有一个平台相关的控制器,该控制器可实现视图模型导航。

感谢您的快速回复!自定义应用程序启动或单独的应用程序启动将起到作用,但仅在应用程序开始时(应用程序启动:)。如果我希望以后在导航过程中有类似的行为,比如在手机上的第7、8和9页之间有单独的导航,而在使用相同核心项目的metro应用程序上有一个包含内容7、8和9的“大页面”导航,会怎么样?我编辑我的回复以包括此场景。如果您认为这是您需要的,请标记为答案。