Caliburn.Micro 3.0相当于Xamarin.Forms Navigation.PushModalAsync

Caliburn.Micro 3.0相当于Xamarin.Forms Navigation.PushModalAsync,xamarin,xamarin.forms,caliburn.micro,Xamarin,Xamarin.forms,Caliburn.micro,Caliburn.Micro 3.0(和Caliburn.Micro.Xamarin.Forms)是否实现了模拟/支持Xamarin.Forms中的导航.PushModalAsync的功能?否。它不是内置的,但很容易增强。通常,MvvM框架通过ViewModels进行导航。卡利本正遵循这一模式。所以它需要某种导航服务。此navigationservice负责为ViewModels创建视图,并调用视图框架(在本例中为Xamarin.Froms)特定的导航功能NavigationPageAdapte

Caliburn.Micro 3.0(和Caliburn.Micro.Xamarin.Forms)是否实现了模拟/支持Xamarin.Forms中的导航.PushModalAsync的功能?

否。它不是内置的,但很容易增强。通常,MvvM框架通过ViewModels进行导航。卡利本正遵循这一模式。所以它需要某种导航服务。此navigationservice负责为ViewModels创建视图,并调用视图框架(在本例中为Xamarin.Froms)特定的导航功能
NavigationPageAdapter
是我们正在搜索的东西。现在让我们增强它

公共接口IModalNavigationService:INavigationService
{
任务导航emodalToViewModelAsync(对象参数=null,bool动画=true);
//TODO:添加更多用于关闭的函数
}
公共类ModalNavigationPageAdapter:NavigationPageAdapter,IModalNavigationService
{
私有只读导航页面_导航页面;
public ModalNavigationPageAdapter(NavigationPage NavigationPage):基本(NavigationPage)
{
_导航页面=导航页面;
}
公共异步任务NavigateModalToViewModelAsync(对象参数=null,bool动画=true)
{
var view=ViewLocator.LocateForModelType(typeof(TViewModel),null,null);
等待PushModalAsync(视图、参数、动画);
}
私有任务PushModalAsync(元素视图、对象参数、bool动画)
{
var page=查看为页面;
如果(第==null页)
抛出新的NotSupportedException(String.Format(“{0}不继承自{1}.”,view.GetType(),typeof(Page));
var viewModel=viewmodelocator.LocateForView(视图);
if(viewModel!=null)
{
TryInputParameters(viewModel,parameter);
Bind(viewModel,view,null);
}
页面显示+=(s,e)=>激活视图(第页);
页面消失+=(s,e)=>取消激活查看(第页);
return\u navigationPage.Navigation.PushModalAsync(页面,动画);
}
私有静态无效停用视图(BindableObject视图)
{
如果(视图==null)
返回;
var deactivate=view.BindingContext作为IDeactivate;
如果(停用!=null)
{
停用。停用(假);
}
}
私有静态void ActivateView(BindableObject视图)
{
如果(视图==null)
返回;
var activator=view.BindingContext作为IActivate;
如果(激活器!=null)
{
activator.Activate();
}
}
}
我们刚刚声明了接口
IModalNavigationService
,它扩展了
INavigationService
,并在我们的
ModalNavigationPageAdapter
中实现了它。不幸的是,Caliburn将许多函数设置为私有,因此我们必须将它们复制到继承的版本中

在caliburn中,您可以通过
navigationservice.For().navigate()
进行导航。我们希望遵循这种风格,因此我们必须实现类似于
navigationservice.ModalFor().Navigate()
的东西,这是在扩展方法中实现的

公共静态类ModalNavigationExtensions
{
公共静态ModalNavigateHelper ModalFor(此IModalNavigationService导航服务)
{
返回新的ModalNavigateHelper().AttachTo(navigationService);
}
}
此方法返回简化导航服务使用的
ModalNavigateHelper
(类似于Caliburn的
NavigateHelper
)。它几乎是一个副本,但对于
IModalNavigationService

公共类ModalNavigateHelper
{
只读字典参数=新建字典();
IModalNavigationService导航服务;
public ModalNavigateHelper with Param(表达式属性,TValue值)
{
if(值为ValueType | |!ReferenceEquals(null,value))
{
参数[property.GetMemberInfo().Name]=值;
}
归还这个;
}
公共ModalNavigateHelper附件(IModalNavigationService导航服务)
{
this.navigationService=导航服务;
归还这个;
}
公共无效导航(bool animated=true)
{
如果(导航服务==null)
{
抛出新的InvalidOperationException(“如果不附加INavigationService,则无法导航。请先调用AttachTo。”);
}
navigationService.NavigateModalToViewModelAsync(参数,动画);
}
}
最后但并非最不重要的一点是,我们必须使用全新的导航服务,而不是旧的导航服务。
App
类正在将
INavigationService
NavigationPageAdapter
注册为
PrepareViewFirst
中的单例。我们必须改变它如下

公共类应用程序:FormsApplication
{
私有只读SimpleContainer容器;
公共应用程序(SimpleContainer容器)
{
this.container=容器;
容器
.PerRequest()
.PerRequest();
初始化();
DisplayRootView();
}
受保护的覆盖void PrepareViewFirst(导航页面导航页面)
{
var navigationService=新的ModalNavigationPageAdapter(navigationPage);
实例(导航服务);
实例(导航服务);
}
}
我们正在注册
INavigationService
IModalNavigationService
的导航服务

正如您在注释中所看到的,您必须自己实现调用
PopModalAsync
的close函数