【问题标题】:Tabbed page as detail view of masterdetail page in Exrin选项卡式页面作为 Exrin 中 masterdetail 页面的详细视图
【发布时间】:2018-02-01 01:42:57
【问题描述】:

在我们的应用中,有一个主从容器作为主视图容器。我们希望将选项卡式页面作为主从容器的详细信息页面,以便用户能够通过菜单和选项卡栏执行导航。有没有办法用 Exrin 实现这一目标? 据我们所见,分别支持主从页面和选项卡页面。如何将这些页面组合在一起?

【问题讨论】:

  • 我很快就会看看这个。这是一个复杂的情况,因为你有一个容器,在一个容器中。
  • 好的,已经找到了一种方法,但是它会导致 NavigationService 中的一些错误。将修复这些问题,然后发布一个新的 Exrin 版本,并详细说明如何做到这一点。
  • @AdamPedley 谢谢你,期待新的 Exrin 版本 :)

标签: xamarin.forms exrin


【解决方案1】:

您需要拥有 Exrin 2.0.2 及更高版本才能正常工作。

首先,您需要稍微更新包含 MasterDetailPage 的 Container。接口定义略有改动。

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; }

}

【讨论】:

  • 感谢您的更新和操作说明 :) 该解决方案在新的 Exrin 版本中按预期工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-28
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2021-07-04
  • 2014-05-18
相关资源
最近更新 更多