所有人(android、iOs和WinPhone)都可以使用Xamarin表单中带有Tabbar的ActionBar

所有人(android、iOs和WinPhone)都可以使用Xamarin表单中带有Tabbar的ActionBar,xamarin,xamarin.forms,Xamarin,Xamarin.forms,我需要在xamarin表单中创建一个带有TabbedLayout控件的ActionBar,在xamarin Android中我很容易做到,但现在他们希望在平台IOS和Android中使用xamarin表单。请分享任何示例或给我建议如何在XamariFroms中创建自定义控件 下面我附上了图片我需要如何与选项卡式布局的行动栏 要在Xamarin.Forms中获得选项卡式布局,您通常会使用。这将为您提供在Android上显示的选项卡。在iOS和Windows上,您将获得本机替代方案。这意味着您将在i

我需要在xamarin表单中创建一个带有TabbedLayout控件的ActionBar,在xamarin Android中我很容易做到,但现在他们希望在平台IOS和Android中使用xamarin表单。请分享任何示例或给我建议如何在XamariFroms中创建自定义控件

下面我附上了图片我需要如何与选项卡式布局的行动栏


要在Xamarin.Forms中获得选项卡式布局,您通常会使用。这将为您提供在Android上显示的选项卡。在iOS和Windows上,您将获得本机替代方案。这意味着您将在iOS上的屏幕底部获得标签,在Windows上,您将在顶部获得标签(类似,但与Android完全相同)。参见Xamarin文档中的图示:


如果您想创建自己的版本,您可以实现自己版本的。

以在Xamarin.Forms中获得选项卡式布局,您通常会使用。这将为您提供在Android上显示的选项卡。在iOS和Windows上,您将获得本机替代方案。这意味着您将在iOS上的屏幕底部获得标签,在Windows上,您将在顶部获得标签(类似,但与Android完全相同)。参见Xamarin文档中的图示:


如果您想创建自己的版本,您可以实现自己版本的。

如果您使用的是Xamarin.Forms,则Android选项卡页面的选项卡项将位于顶部。对于iOS,必须创建渲染器才能实现它。但是,在顶部显示Tabbar项违反了iOS的用户指南

创建自定义渲染,覆盖ViewDidLayoutSubView并添加以下代码行

[assembly: ExportRenderer(typeof(ExtendedTabbedPage), typeof(ExtendedTabbedPageRenderer))]
namespace ExtendedTabbedPage.Pages
{
    public class ExtendedTabbedPageRenderer : TabbedRenderer
    {
        private ExtendedTabbedPage Page => (ExtendedTabbedPage)Element;
    public ExtendedTabbedPageRenderer()
    {

    }

    protected override void OnElementChanged(VisualElementChangedEventArgs e)
    {
        base.OnElementChanged(e);

        var page = (ExtendedTabbedPage)Element;
        page.CurrentPageChanged += Page_CurrentPageChanged;

    }

    public override void ViewWillAppear(bool animated)
    {
        base.ViewWillAppear(animated);
        Page_CurrentPageChanged();
    }


    public override void ViewDidLayoutSubviews()
    {
        base.ViewDidLayoutSubviews();
        SetTabPostition();
    }

    void SetTabPostition()
    {
        if (Element == null)
            return;

        var element = Element as ExtendedTabbedPage;

        this.TabBar.InvalidateIntrinsicContentSize();

        nfloat tabSize = 74.0f;

        UIInterfaceOrientation orientation = UIApplication.SharedApplication.StatusBarOrientation;

        if (UIInterfaceOrientation.LandscapeLeft == orientation || UIInterfaceOrientation.LandscapeRight == orientation)
        {
            tabSize = 32.0f;
        }

        CGRect tabFrame = this.TabBar.Frame;
        CGRect viewFrame = this.View.Frame;

        tabFrame.Height = tabSize;
        tabFrame.Y = this.View.Frame.Y;
        this.TabBar.Frame = tabFrame;
        this.TabBar.ContentMode = UIViewContentMode.Top;

        PageController.ContainerArea = new Rectangle(0, tabFrame.Y + tabFrame.Height, viewFrame.Width, viewFrame.Height - tabFrame.Height);
        this.TabBar.SetNeedsUpdateConstraints();
    }

    void Page_CurrentPageChanged()
    {
        var current = Tabbed.CurrentPage;
        //if Tab is more than 5 then more will appear in iOS
        if (current == null)
        {
            CGRect tabFrm = this.TabBar.Frame;
            if (this.MoreNavigationController != null)
            {
                var morenavframe = this.MoreNavigationController.View.Frame;
                morenavframe.Y = tabFrm.Y + tabFrm.Height;
                this.MoreNavigationController.View.Frame = morenavframe;

                foreach (var morecontroller in this.MoreNavigationController.ViewControllers)
                {
                    var morecontframe = morecontroller.View.Frame;
                    morecontframe.Y = morenavframe.Y + morenavframe.Height;
                    morecontroller.View.Frame = tabFrm;
                }
            }
            return;
        }

        var controller = Platform.GetRenderer(current);
        if (controller == null)
            return;

        var frame = controller.ViewController.View.Frame;
        CGRect tabFrame = this.TabBar.Frame;
        frame.Y = (tabFrame.Y + tabFrame.Height);
        controller.ViewController.View.Frame = frame;
        this.View.Frame = frame;
    }


    public override void ViewDidAppear(bool animated)
    {
        base.ViewDidAppear(animated);
        Page_CurrentPageChanged();
    }
  }
}

如果您使用的是Xamarin.Forms选项卡式页面,对于Android,选项卡项将位于顶部。对于iOS,必须创建渲染器才能实现它。但是,在顶部显示Tabbar项违反了iOS的用户指南

创建自定义渲染,覆盖ViewDidLayoutSubView并添加以下代码行

[assembly: ExportRenderer(typeof(ExtendedTabbedPage), typeof(ExtendedTabbedPageRenderer))]
namespace ExtendedTabbedPage.Pages
{
    public class ExtendedTabbedPageRenderer : TabbedRenderer
    {
        private ExtendedTabbedPage Page => (ExtendedTabbedPage)Element;
    public ExtendedTabbedPageRenderer()
    {

    }

    protected override void OnElementChanged(VisualElementChangedEventArgs e)
    {
        base.OnElementChanged(e);

        var page = (ExtendedTabbedPage)Element;
        page.CurrentPageChanged += Page_CurrentPageChanged;

    }

    public override void ViewWillAppear(bool animated)
    {
        base.ViewWillAppear(animated);
        Page_CurrentPageChanged();
    }


    public override void ViewDidLayoutSubviews()
    {
        base.ViewDidLayoutSubviews();
        SetTabPostition();
    }

    void SetTabPostition()
    {
        if (Element == null)
            return;

        var element = Element as ExtendedTabbedPage;

        this.TabBar.InvalidateIntrinsicContentSize();

        nfloat tabSize = 74.0f;

        UIInterfaceOrientation orientation = UIApplication.SharedApplication.StatusBarOrientation;

        if (UIInterfaceOrientation.LandscapeLeft == orientation || UIInterfaceOrientation.LandscapeRight == orientation)
        {
            tabSize = 32.0f;
        }

        CGRect tabFrame = this.TabBar.Frame;
        CGRect viewFrame = this.View.Frame;

        tabFrame.Height = tabSize;
        tabFrame.Y = this.View.Frame.Y;
        this.TabBar.Frame = tabFrame;
        this.TabBar.ContentMode = UIViewContentMode.Top;

        PageController.ContainerArea = new Rectangle(0, tabFrame.Y + tabFrame.Height, viewFrame.Width, viewFrame.Height - tabFrame.Height);
        this.TabBar.SetNeedsUpdateConstraints();
    }

    void Page_CurrentPageChanged()
    {
        var current = Tabbed.CurrentPage;
        //if Tab is more than 5 then more will appear in iOS
        if (current == null)
        {
            CGRect tabFrm = this.TabBar.Frame;
            if (this.MoreNavigationController != null)
            {
                var morenavframe = this.MoreNavigationController.View.Frame;
                morenavframe.Y = tabFrm.Y + tabFrm.Height;
                this.MoreNavigationController.View.Frame = morenavframe;

                foreach (var morecontroller in this.MoreNavigationController.ViewControllers)
                {
                    var morecontframe = morecontroller.View.Frame;
                    morecontframe.Y = morenavframe.Y + morenavframe.Height;
                    morecontroller.View.Frame = tabFrm;
                }
            }
            return;
        }

        var controller = Platform.GetRenderer(current);
        if (controller == null)
            return;

        var frame = controller.ViewController.View.Frame;
        CGRect tabFrame = this.TabBar.Frame;
        frame.Y = (tabFrame.Y + tabFrame.Height);
        controller.ViewController.View.Frame = frame;
        this.View.Frame = frame;
    }


    public override void ViewDidAppear(bool animated)
    {
        base.ViewDidAppear(animated);
        Page_CurrentPageChanged();
    }
  }
}

我需要为所有的平台@Jon Stodle设计相同的样式,然后您必须对
多页
进行子类化,并自己实现它。我没有亲自做过,但我知道以前也做过。谢谢@Jon Stodle如果你发现任何例子,请与mei分享@Jon Stodle需要为所有平台设计相同的样式,那么你必须对
多页
进行子类化,然后自己实现它。我没有亲自做过,但我知道以前也做过。谢谢@Jon Stodle如果你发现任何例子,请与我分享