Xamarin.forms 获取依赖项服务中的导航栏高度-Xamarin表单

Xamarin.forms 获取依赖项服务中的导航栏高度-Xamarin表单,xamarin.forms,xamarin.ios,Xamarin.forms,Xamarin.ios,我有一个问题,我需要在依赖项服务中获取导航栏的高度 目前,我一直在想接下来要做什么。我尝试了在stackoverflow和google中找到的所有东西,但没有人为我工作 这是我的密码: [assembly: Dependency(typeof(DeviceInfo))] namespace Wicket.App.Mobile.iOS.Framework { public class DeviceInfo : IDeviceInfo { public float S

我有一个问题,我需要在依赖项服务中获取导航栏的高度

目前,我一直在想接下来要做什么。我尝试了在stackoverflow和google中找到的所有东西,但没有人为我工作

这是我的密码:

[assembly: Dependency(typeof(DeviceInfo))]
namespace Wicket.App.Mobile.iOS.Framework
{
    public class DeviceInfo : IDeviceInfo
    {
        public float StatusBarHeight => (float)UIApplication.SharedApplication.StatusBarFrame.Size.Height;

        public float NavigationBarHeight => GetNavigationBarHeight();

        public static UINavigationController NavigationController { get; set; }

        public float GetNavigationBarHeight()
        {
            //Get navigation bar height


            return 0;
        }
    }
}

我已经完成了安卓部分,效果很好。现在唯一的问题是iOS。我已经尝试在AppDelegate中获取navigationcontroller的实例,这样我就可以像这样获取条形图框架
NavigationBar.Bounds.Height

我认为这应该有效:

var navheight = GetTopViewController().NavigationController.NavigationBar.Frame.Height;


public static UIViewController GetTopViewController()
    {
        var window = UIApplication.SharedApplication.KeyWindow;
        var vc = window.RootViewController;
        while (vc.PresentedViewController != null)
            vc = vc.PresentedViewController;

        if (vc is UINavigationController navController)
            vc = navController.ViewControllers.Last();

        return vc;
    }

解决方案:

如何在
IDeviceInfo
中的函数中将viewController的实例作为参数传递

试试这个:

 public void getNaviHeight(ContentPage vc)
    {
        var renderer = Platform.GetRenderer(vc);
        if (renderer == null)
        {
            renderer = RendererFactory.GetRenderer(vc);
            Platform.SetRenderer(vc, renderer);
        }
        var viewController = renderer.ViewController;

        var h = viewController.NavigationController?.NavigationBar.Frame.Height;

    }
并使用依赖项:

public MainPage ()
{
        DependencyService.Get<IDeviceInfo>().getNaviHeight(this);
}
公共主页()
{
DependencyService.Get().getNaviHeight(此);
}
这对我很有效:

var navigationBar = UIApplication.SharedApplication.KeyWindow.RootViewController.View.Subviews[0].Subviews.OfType<UINavigationBar>().FirstOrDefault();

if(navigationBar != null)
{
      // continue here...
}
var navigationBar=UIApplication.SharedApplication.KeyWindow.RootViewController.View.Subviews[0]。Subviews.OfType().FirstOrDefault();
如果(导航栏!=null)
{
//继续这里。。。
}

我已经试过了,但它会使我的应用程序崩溃,或者结果为空。在NavigationController部分,它的结果总是为空。不是我在我的页面构造器上使用依赖关系导航是如何开始的?它是从主控详细信息页面开始的您的MD页面是否初始化为MainPage=NavigationPage(MD)?或者,MD页面中的详细信息页面作为导航页面推送?您获得viewController了吗?你能提供一个简单的演示或者更多的代码来展示你的项目结构吗?我有一个ViewController,但是NavigationController总是空的。那么,你得到的ViewController和你想要的控制器一样吗?你的代码中的viewController真的有
NavigationController
吗?我不确定我得到的viewController是我想要的。我得到的页面有带有菜单图标/汉堡图标的导航栏。因此,我确信应该有一个导航控制器。您可以检查
viewcontroller
是否正确。我认为如果它是正确的,并且在您得到它之后,您应该得到它的
navigationController