与ViewModel中相比,是否有更好的方法来设置TabbedPage底部标签栏的高度?

时间:2019-03-05 11:17:23

标签: xamarin xamarin.forms

我想在Xamarin应用程序中更改底部TabBar的高度。现在,我通过ViewModel属性执行此操作:

public partial class MainPage : TabbedPage
{
    public int TabBarHeight
    {
        get { return _tabBarHeight; }
        set { _tabBarHeight = value; OnPropertyChanged(); }
    }
    int _tabBarHeight = 200;

以及适用于iOS的自定义渲染器:

using System;
using UIKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
using System.Diagnostics;
using Ja.Enums;
using System.ComponentModel;
using CoreGraphics;

[assembly: ExportRenderer(typeof(TabbedPage), typeof(Ja.iOS.TabbedPageRenderer))]
namespace Ja.iOS
{
    public class TabbedPageRenderer : TabbedRenderer
    {
        private MainPage _page;

        public TabbedPageRenderer()
        {
            this.ViewControllerSelected += OnTabbarControllerItemSelected;
        }

        public override void ViewWillLayoutSubviews()
        {
            base.ViewWillLayoutSubviews();
            TabBar.Frame = new CGRect(TabBar.Frame.X, TabBar.Frame.Y + (TabBar.Frame.Height - _page.TabBarHeight), TabBar.Frame.Width, _page.TabBarHeight);
        }

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

            if (e.OldElement != null)
            {
                e.OldElement.PropertyChanged -= Current_PropertyChanged;
                return;
            }

            if (e.NewElement != null)
            {
                _page = (MainPage)e.NewElement;
                e.NewElement.PropertyChanged += Current_PropertyChanged;
            }
        }

        void Current_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            if (e.PropertyName == "FrameHeight")
                ViewWillLayoutSubviews();
        }

    }
}

这是执行此操作的最佳方法吗?我似乎记得有一个共同的课堂。该类将包含在main的前几行中作为绑定元素的代码。

任何人都可以对此发表评论,也许会建议一种更好的方法。

1 个答案:

答案 0 :(得分:1)

看起来我将使用“自定义控件”(这是我认为您对“共享类”的意思)。

首先,您在PCL中创建下面的类。一个CustomTabbedPage,它继承自TabbedPage,但具有一个额外的属性:'TabBarHeight'

public class CustomTabbedPage : TabbedPage {

    public static readonly BindableProperty TabBarHeightProperty = BindableProperty.Create("TabBarHeight", typeof(int), typeof(TabbedPage), 0);

    public int TabBarHeight {
        get { return (int)GetValue(TabBarHeightProperty); }
        set { SetValue(TabBarHeightProperty, value); }
    }
}

现在将渲染器编辑为CustomTabbedPage的渲染器。然后,您可以使用this.Element.TabBarHeight轻松访问TabBarHeight属性。

using System;
using UIKit;
using Xamarin.Forms;
using Xamarin.Forms.Platform.iOS;
using System.Diagnostics;
using Ja.Enums;
using System.ComponentModel;
using CoreGraphics;

[assembly: ExportRenderer(typeof(CustomTabbedPage), typeof(Ja.iOS.CustomTabbedPageRenderer))]
namespace Ja.iOS
{
    public class CustomTabbedPageRenderer : TabbedRenderer
    {
        public TabbedPageRenderer()
        {
            this.ViewControllerSelected += OnTabbarControllerItemSelected;
        }

        public override void ViewWillLayoutSubviews()
        {
            base.ViewWillLayoutSubviews();

            TabBar.Frame = new CGRect(TabBar.Frame.X, TabBar.Frame.Y + (TabBar.Frame.Height - this.Element.TabBarHeight), TabBar.Frame.Width, this.Element.TabBarHeight);
        }

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

            if (e.OldElement != null) {
                e.OldElement.PropertyChanged -= Element_PropertyChanged;
            }

            if (e.NewElement != null) {
                e.NewElement.PropertyChanged += Element_PropertyChanged;
            }
        }

        void Current_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            if (e.PropertyName == "FrameHeight")
                ViewWillLayoutSubviews();
        }

    }
}

其中可能存在一些语法错误,但您明白了。

如有任何疑问,请射击。