在带有 Autofac 和 Xamarin.Forms 的 MasterDetailPage 中使用导航
Using Navigation in MasterDetailPage with Autofac and Xamarin.Forms
我正在尝试在 Xamarin.Forms 项目中使用 Autofac。我成功创建了基本示例,甚至使用 ViewFactory 制作了一些更复杂的示例。
但是,我无法将 MasterDetailPage
与导航一起使用。
我正在使用 Jonathan Yates. You can find his code here
编写的工厂和服务
我的应用程序引导程序:
protected override void ConfigureApplication(IContainer container)
{
var viewFactory = container.Resolve<IViewFactory>();
var mainPage = viewFactory.Resolve<TestViewModel1>();
var navigationPage = new NavigationPage(mainPage);
var masterPage = new ContentPage();
masterPage.Title = "asd";
_application.MainPage = new MasterDetailPage()
{
Master = masterPage,
Detail = navigationPage
};
}
我的 TestViewModel1
有一个导航到 TestViewModel2
的命令:
ButtonCommand = new Command(async()=>await _navigator.PushAsync<TestViewModel2>());
但是,应用程序崩溃并出现异常
Cannot cast from source type to destination type.
当 Navigator
推送下一页时会发生这种情况。
堆栈跟踪:
" at TestIoc.TestModule+<>c.b__0_0 () [0x00000] in C:\Users\dushyantb\Documents\Visual Studio 2015\Projects\TestIoc\TestIoc\TestIoc\TestModule.cs:27 \n at TestIoc.Views.PageProxy.get_Navigation () [0x00001] in C:\Users\dushyantb\Documents\Visual Studio 2015\Projects\TestIoc\TestIoc\TestIoc\Views\PageProxy.cs:39 \n at TestIoc.Navigator.get_Navigation () [0x00001] in C:\Users\dushyantb\Documents\Visual Studio 2015\Projects\TestIoc\TestIoc\TestIoc\Services\Navigator.cs:26 \n at TestIoc.Navigator+d__8`1[TestIoc.ViewModels.TestViewModel2].MoveNext () [0x0003a] in C:\Users\dushyantb\Documents\Visual Studio 2015\Projects\TestIoc\TestIoc\TestIoc\Services\Navigator.cs:58 "
我做错了什么?
注意:当没有 MasterDetailPage 时,导航有效。
确保不要覆盖 PageResolver,例如。不要采用 Jonathan 在他的 WeatherApp 示例中使用的覆盖:
builder.RegisterInstance<Func<Page>>(() => ((NavigationPage)Application.Current.MainPage).CurrentPage);
核心组件中 PageResolver Func 的默认实现负责 MasterDetail 场景。见 AutoFacModule.cs:
// default page resolver
builder.RegisterInstance<Func<Page>>(() =>
{
// Check if we are using MasterDetailPage
var masterDetailPage = Application.Current.MainPage as MasterDetailPage;
var page = masterDetailPage != null
? masterDetailPage.Detail
: Application.Current.MainPage;
// Check if page is a NavigationPage
var navigationPage = page as IPageContainer<Page>;
return navigationPage != null
? navigationPage.CurrentPage
: page;
}
);
我已经使用 Jonathan 的框架成功地测试了带有 NavigationPage DetailViews 的 MasterDetail 场景。所以它应该可以工作。
在我的例子中,引导代码是
protected override void ConfigureApplication(IContainer container)
{
// set main page
var viewFactory = container.Resolve<IViewFactory>();
var mainPage = viewFactory.Resolve<MainPageViewModel> ();
_application.MainPage = mainPage;
}
也就是说,我有一个 MainPageView,它是一个 MasterDetailPage,负责设置它的子视图:
public class MainPage : MasterDetailPage
{
public MainPage (IViewFactory viewfactory)
{
Master = viewfactory.Resolve<MenuPageViewModel>();
Detail = new NavigationPage (viewfactory.Resolve<DetailViewModel1>());
}
}
MenuPageViewModel 还使用 IViewFactory 来切换 MasterPages 的详细信息:
public class MenuPageViewModel : ViewModelBase
{
IViewFactory _viewFactory;
public MenuPageViewModel (IViewFactory viewFactory)
{
_viewFactory = viewFactory;
ShowDetail1Command = new Command (ShowDetail1);
ShowDetail2Command = new Command (ShowDetail2);
}
public ICommand ShowDetail1Command { get; set;}
public void ShowDetail1() {
var mainPage = _viewFactory.Resolve<MainPageViewModel> ();
((MasterDetailPage)mainPage).Detail = new NavigationPage (_viewFactory.Resolve<DetailViewModel1> ());
}
public ICommand ShowDetail2Command { get; set;}
public void ShowDetail2() {
var mainPage = _viewFactory.Resolve<MainPageViewModel> ();
((MasterDetailPage)mainPage).Detail = new NavigationPage (_viewFactory.Resolve<DetailViewModel2> ());
}
}
希望对您有所帮助。
我正在尝试在 Xamarin.Forms 项目中使用 Autofac。我成功创建了基本示例,甚至使用 ViewFactory 制作了一些更复杂的示例。
但是,我无法将 MasterDetailPage
与导航一起使用。
我正在使用 Jonathan Yates. You can find his code here
我的应用程序引导程序:
protected override void ConfigureApplication(IContainer container)
{
var viewFactory = container.Resolve<IViewFactory>();
var mainPage = viewFactory.Resolve<TestViewModel1>();
var navigationPage = new NavigationPage(mainPage);
var masterPage = new ContentPage();
masterPage.Title = "asd";
_application.MainPage = new MasterDetailPage()
{
Master = masterPage,
Detail = navigationPage
};
}
我的 TestViewModel1
有一个导航到 TestViewModel2
的命令:
ButtonCommand = new Command(async()=>await _navigator.PushAsync<TestViewModel2>());
但是,应用程序崩溃并出现异常
Cannot cast from source type to destination type.
当 Navigator
推送下一页时会发生这种情况。
堆栈跟踪:
" at TestIoc.TestModule+<>c.b__0_0 () [0x00000] in C:\Users\dushyantb\Documents\Visual Studio 2015\Projects\TestIoc\TestIoc\TestIoc\TestModule.cs:27 \n at TestIoc.Views.PageProxy.get_Navigation () [0x00001] in C:\Users\dushyantb\Documents\Visual Studio 2015\Projects\TestIoc\TestIoc\TestIoc\Views\PageProxy.cs:39 \n at TestIoc.Navigator.get_Navigation () [0x00001] in C:\Users\dushyantb\Documents\Visual Studio 2015\Projects\TestIoc\TestIoc\TestIoc\Services\Navigator.cs:26 \n at TestIoc.Navigator+d__8`1[TestIoc.ViewModels.TestViewModel2].MoveNext () [0x0003a] in C:\Users\dushyantb\Documents\Visual Studio 2015\Projects\TestIoc\TestIoc\TestIoc\Services\Navigator.cs:58 "
我做错了什么?
注意:当没有 MasterDetailPage 时,导航有效。
确保不要覆盖 PageResolver,例如。不要采用 Jonathan 在他的 WeatherApp 示例中使用的覆盖:
builder.RegisterInstance<Func<Page>>(() => ((NavigationPage)Application.Current.MainPage).CurrentPage);
核心组件中 PageResolver Func 的默认实现负责 MasterDetail 场景。见 AutoFacModule.cs:
// default page resolver
builder.RegisterInstance<Func<Page>>(() =>
{
// Check if we are using MasterDetailPage
var masterDetailPage = Application.Current.MainPage as MasterDetailPage;
var page = masterDetailPage != null
? masterDetailPage.Detail
: Application.Current.MainPage;
// Check if page is a NavigationPage
var navigationPage = page as IPageContainer<Page>;
return navigationPage != null
? navigationPage.CurrentPage
: page;
}
);
我已经使用 Jonathan 的框架成功地测试了带有 NavigationPage DetailViews 的 MasterDetail 场景。所以它应该可以工作。
在我的例子中,引导代码是
protected override void ConfigureApplication(IContainer container)
{
// set main page
var viewFactory = container.Resolve<IViewFactory>();
var mainPage = viewFactory.Resolve<MainPageViewModel> ();
_application.MainPage = mainPage;
}
也就是说,我有一个 MainPageView,它是一个 MasterDetailPage,负责设置它的子视图:
public class MainPage : MasterDetailPage
{
public MainPage (IViewFactory viewfactory)
{
Master = viewfactory.Resolve<MenuPageViewModel>();
Detail = new NavigationPage (viewfactory.Resolve<DetailViewModel1>());
}
}
MenuPageViewModel 还使用 IViewFactory 来切换 MasterPages 的详细信息:
public class MenuPageViewModel : ViewModelBase
{
IViewFactory _viewFactory;
public MenuPageViewModel (IViewFactory viewFactory)
{
_viewFactory = viewFactory;
ShowDetail1Command = new Command (ShowDetail1);
ShowDetail2Command = new Command (ShowDetail2);
}
public ICommand ShowDetail1Command { get; set;}
public void ShowDetail1() {
var mainPage = _viewFactory.Resolve<MainPageViewModel> ();
((MasterDetailPage)mainPage).Detail = new NavigationPage (_viewFactory.Resolve<DetailViewModel1> ());
}
public ICommand ShowDetail2Command { get; set;}
public void ShowDetail2() {
var mainPage = _viewFactory.Resolve<MainPageViewModel> ();
((MasterDetailPage)mainPage).Detail = new NavigationPage (_viewFactory.Resolve<DetailViewModel2> ());
}
}
希望对您有所帮助。