Xamarin.forms 选项卡式页面作为Exrin中masterdetail页面的详细视图
在我们的应用程序中,有一个主细节容器作为主视图容器。我们希望将选项卡式页面作为主详细信息容器的详细信息页面,以便用户能够通过菜单和选项卡栏执行导航。有没有办法用埃克斯林来达到这个目的?Xamarin.forms 选项卡式页面作为Exrin中masterdetail页面的详细视图,xamarin.forms,exrin,Xamarin.forms,Exrin,在我们的应用程序中,有一个主细节容器作为主视图容器。我们希望将选项卡式页面作为主详细信息容器的详细信息页面,以便用户能够通过菜单和选项卡栏执行导航。有没有办法用埃克斯林来达到这个目的? 就我们所见,分别支持母版详细信息页面和选项卡式页面。如何将这些页面组合在一起?您需要使用Exrin 2.0.2及更高版本才能正常工作 首先,您需要稍微更新保存MasterDetailPage的容器。接口定义略有更改 public class MainContainer : ViewContainer, IMast
就我们所见,分别支持母版详细信息页面和选项卡式页面。如何将这些页面组合在一起?您需要使用Exrin 2.0.2及更高版本才能正常工作 首先,您需要稍微更新保存MasterDetailPage的容器。接口定义略有更改
public class MainContainer : ViewContainer, IMasterDetailContainer
{
private MasterDetailPage page;
public MainContainer(TabbedViewContainer mainStack, MenuStack menuStack)
: base(Containers.Main.ToString())
{
page = new MasterDetailPage();
var mdp = new MasterDetailProxy(page);
NativeView = mdp.View;
Proxy = mdp;
DetailStack = mainStack;
MasterStack = menuStack;
RegionMapping.Add(Regions.Menu, ContainerType.Master);
RegionMapping.Add(Regions.Main, ContainerType.Detail);
}
private IHolder _detailStack;
public IHolder DetailStack { get { return _detailStack; } set { _detailStack = value; if (_detailStack is ITabbedContainer container) ((ViewContainer)container).ParentContainer = this; } }
private IHolder _masterStack;
public IHolder MasterStack { get { return _masterStack; } set { _masterStack = value; if (_masterStack is ITabbedContainer container) ((ViewContainer)container).ParentContainer = this; } }
public IMasterDetailProxy Proxy { get; set; }
public bool IsPresented
{
get
{
return page.IsPresented;
}
set
{
page.IsPresented = value;
}
}
public void SetStack(ContainerType type, object newPage)
{
switch (type)
{
case ContainerType.Detail:
page.Detail = newPage as Page;
break;
case ContainerType.Master:
page.Master = newPage as Page;
break;
}
}
}
第二,请注意,您传递的不是构造函数中的堆栈,而是TabbedViewContainer,并根据需要分配它。您的TabbedViewContainer可能如下所示
public class TabbedViewContainer : Exrin.Framework.ViewContainer, ITabbedContainer
{
public TabbedViewContainer(MainStack mainStack, SecondStack secondStack)
: base(Containers.Tabbed.ToString(), null)
{
Children = new List<IStack>() { mainStack, secondStack };
var tabbedPage = new Xamarin.Forms.TabbedPage();
var tabbed = new TabbedProxy(tabbedPage);
NativeView = tabbed.View;
foreach (var child in Children)
{
tabbed.Children.Add(child.Proxy.NativeView);
}
}
public IList<IStack> Children { get; set; }
}
公共类选项卡ViewContainer:Exrin.Framework.ViewContainer,ITabbeddContainer
{
公共选项卡BedViewContainer(MainStack MainStack,SecondStack SecondStack)
:base(Containers.Tabbed.ToString(),null)
{
Children=新列表(){mainStack,secondStack};
var tabbedPage=new Xamarin.Forms.tabbedPage();
var tabbed=新的TabbedProxy(tabbedPage);
NativeView=选项卡式视图;
foreach(儿童中的儿童变量)
{
tabbed.Children.Add(child.Proxy.NativeView);
}
}
公共IList子项{get;set;}
}
您需要使用Exrin 2.0.2及更高版本才能正常工作
首先,您需要稍微更新保存MasterDetailPage的容器。接口定义略有更改
public class MainContainer : ViewContainer, IMasterDetailContainer
{
private MasterDetailPage page;
public MainContainer(TabbedViewContainer mainStack, MenuStack menuStack)
: base(Containers.Main.ToString())
{
page = new MasterDetailPage();
var mdp = new MasterDetailProxy(page);
NativeView = mdp.View;
Proxy = mdp;
DetailStack = mainStack;
MasterStack = menuStack;
RegionMapping.Add(Regions.Menu, ContainerType.Master);
RegionMapping.Add(Regions.Main, ContainerType.Detail);
}
private IHolder _detailStack;
public IHolder DetailStack { get { return _detailStack; } set { _detailStack = value; if (_detailStack is ITabbedContainer container) ((ViewContainer)container).ParentContainer = this; } }
private IHolder _masterStack;
public IHolder MasterStack { get { return _masterStack; } set { _masterStack = value; if (_masterStack is ITabbedContainer container) ((ViewContainer)container).ParentContainer = this; } }
public IMasterDetailProxy Proxy { get; set; }
public bool IsPresented
{
get
{
return page.IsPresented;
}
set
{
page.IsPresented = value;
}
}
public void SetStack(ContainerType type, object newPage)
{
switch (type)
{
case ContainerType.Detail:
page.Detail = newPage as Page;
break;
case ContainerType.Master:
page.Master = newPage as Page;
break;
}
}
}
第二,请注意,您传递的不是构造函数中的堆栈,而是TabbedViewContainer,并根据需要分配它。您的TabbedViewContainer可能如下所示
public class TabbedViewContainer : Exrin.Framework.ViewContainer, ITabbedContainer
{
public TabbedViewContainer(MainStack mainStack, SecondStack secondStack)
: base(Containers.Tabbed.ToString(), null)
{
Children = new List<IStack>() { mainStack, secondStack };
var tabbedPage = new Xamarin.Forms.TabbedPage();
var tabbed = new TabbedProxy(tabbedPage);
NativeView = tabbed.View;
foreach (var child in Children)
{
tabbed.Children.Add(child.Proxy.NativeView);
}
}
public IList<IStack> Children { get; set; }
}
公共类选项卡ViewContainer:Exrin.Framework.ViewContainer,ITabbeddContainer
{
公共选项卡BedViewContainer(MainStack MainStack,SecondStack SecondStack)
:base(Containers.Tabbed.ToString(),null)
{
Children=新列表(){mainStack,secondStack};
var tabbedPage=new Xamarin.Forms.tabbedPage();
var tabbed=新的TabbedProxy(tabbedPage);
NativeView=选项卡式视图;
foreach(儿童中的儿童变量)
{
tabbed.Children.Add(child.Proxy.NativeView);
}
}
公共IList子项{get;set;}
}
我很快就会看到这一点。这是一个复杂的情况,因为您有一个容器,在一个容器中。好的,我们已经找到了一种方法,但是它在NavigationService中导致了一些错误。将修复这些问题,然后发布一个新的Exrin版本,并详细说明如何做到这一点。@AdamPedley谢谢你,期待一个新的Exrin版本:)我很快就会看这个。这是一个复杂的情况,因为您有一个容器,在一个容器中。好的,我们已经找到了一种方法,但是它在NavigationService中导致了一些错误。将修复这些问题,然后发布新的Exrin版本,并详细说明如何操作。@AdamPedley谢谢,期待新的Exrin版本:)感谢您的更新和操作说明:)解决方案与新的Exrin版本的预期效果一致。感谢您的更新和操作说明:)解决方案与新的Exrin版本的预期效果一致。