Насколько мне известно, в Xamarin.Forms невозможно (пока?) получить TabBar
Height
, поэтому вам, возможно, придется собирать эту информацию для каждой платформы. . Затем, используя DependencyService
, вы сможете сделать эту информацию доступной из общего кода Xamarin.Forms. Итак, давайте посмотрим, как это сделать:
iOS
Для iOS уже были опубликованы ответы, такие как это, чтобы объяснить, как это можно сделать.
Андроид
Для Android вы можете получить высоту TabBar следующим образом.
- Создайте Интерфейс для зависимости
Примечание. Этот интерфейс также следует использовать в части iOS;)
namespace Tabbarheight
{
public interface IDisplayHeights
{
float GetTabBarHeight();
}
}
- Создайте в Android класс, который реализует этот интерфейс и возвращает нужное значение.
(спасибо @LucasZhang-MSFT за строку идентификатора!)
using Android.App;
using Tabbarheight.Droid;
using Xamarin.Forms;
[assembly: Dependency(typeof(AndroidDisplayHeights))]
namespace Tabbarheight.Droid
{
class AndroidDisplayHeights : IDisplayHeights
{
public static Activity Activity { get; set; }
public float GetTabBarHeight()
{
int resourceId = Activity.Resources.GetIdentifier("design_bottom_navigation_height", "dimen", Activity.PackageName);
int height = 0;
if (resourceId > 0)
{
height = (int)(Activity.Resources.GetDimensionPixelSize(resourceId) / Xamarin.Essentials.DeviceDisplay.MainDisplayInfo.Density);
}
return height;
}
}
}
где Activity
задается из MainActivity.cs следующим образом
protected override void OnCreate(Bundle savedInstanceState)
{
TabLayoutResource = Resource.Layout.Tabbar;
ToolbarResource = Resource.Layout.Toolbar;
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
AndroidDisplayHeights.Activity = this;
LoadApplication(new App());
}
- И, наконец, вы можете потреблять это следующим образом
public AboutPage()
{
InitializeComponent();
SizeChanged += (s, a) =>
{
label.HeightRequest = DependencyService.Get<IDisplayHeights>().GetTabBarHeight();
label.BackgroundColor = Color.Red;
};
}
В приведенном выше решении я определил Label
(метку) просто для того, чтобы попытаться продемонстрировать точность полученного значения Height
TabBar
, установив высоту Label
.
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="Tabbarheight.Views.AboutPage"
xmlns:vm="clr-namespace:Tabbarheight.ViewModels"
Title="{Binding Title}">
<StackLayout>
<Label x:Name="label">
<Label.Text>
<x:String>
Hola mundo
</x:String>
</Label.Text>
</Label>
</StackLayout>
</ContentPage>
На моей стороне этикетка выглядит так:
person
Deczaloth
schedule
18.11.2020