C# 状态栏和MasterDetailPage Xamarin.Forms之间会出现一个白色条

C# 状态栏和MasterDetailPage Xamarin.Forms之间会出现一个白色条,c#,android,xamarin,xamarin.android,xamarin.forms,C#,Android,Xamarin,Xamarin.android,Xamarin.forms,我正在尝试构建一个简单的地理定位应用程序,用户登录后应该在地图上指出用户的位置。这部分工作正常,但我希望看到从状态栏和视图中删除一个空白,但我不知道如何删除 以下是两个指向错误屏幕的链接: 我已经尝试过这里介绍的解决方案: 但它并没有很好地工作:XAML解决方案没有做任何事情,而上一个解决方案(在构建版本上进行了检查)也使蓝色条消失,这不是研究的效果 这是我的一些代码,如果您还需要什么,请告诉我: 显示地图的页面: <?xml version="1.0" encoding="utf-8

我正在尝试构建一个简单的地理定位应用程序,用户登录后应该在地图上指出用户的位置。这部分工作正常,但我希望看到从状态栏和视图中删除一个空白,但我不知道如何删除

以下是两个指向错误屏幕的链接:

我已经尝试过这里介绍的解决方案: 但它并没有很好地工作:XAML解决方案没有做任何事情,而上一个解决方案(在构建版本上进行了检查)也使蓝色条消失,这不是研究的效果

这是我的一些代码,如果您还需要什么,请告诉我:

显示地图的页面:

<?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="MyApp.View.Detail"
             xmlns:i18n="clr-namespace:MyApp"
             Title=""
             BackgroundColor="{StaticResource MainBackgroundColor}"
             xmlns:maps="clr-namespace:Xamarin.Forms.Maps;assembly=Xamarin.Forms.Maps">
  <StackLayout>
    <ActivityIndicator IsRunning="{Binding IsBusy, Mode=TwoWay}" IsVisible="{Binding IsBusy, Mode=TwoWay}" Color="Blue"/>
    <maps:Map VerticalOptions ="FillAndExpand" HorizontalOptions ="FillAndExpand"
            x:Name="MyMap"
            IsShowingUser="true"
            MapType="Street"
        />
  </StackLayout>
</ContentPage>

问题是我对它不是完全自由的,我是一名实习生,必须听从客户的命令…

它是在Xamarin表单中以这种方式构建的-它总是添加顶部填充。已经为此提出了一个bug,但不知道何时可以修复

我已经设法用一个自定义渲染器解决了这个问题,该渲染器进行了一些黑客反射:

[assembly: ExportRenderer(typeof(MasterDetailPage), typeof(NoSpaceMasterDetailPageRenderer))]

namespace Droid.Renderers
{
    public class NoSpaceMasterDetailPageRenderer : MasterDetailPageRenderer
    {
        /// <summary>
        /// When adding a view, tweak the top padding if necessary.
        /// According to:
        /// https://github.com/xamarin/Xamarin.Forms/blob/589adbd3ef145ec85f9fe64eda008251c1cdb745/Xamarin.Forms.Platform.Android/AppCompat/MasterDetailPageRenderer.cs
        /// The TopPadding is always set for the detail. This works fine when the master detail is shown normally, but
        /// if it is inside a navigation page (such as the inspection view) then you get extra unwanted padding.
        /// The 'fix' is to set the top padding to 0 for the detail, only of course the types and fields are hidden from us...
        /// </summary>
        /// <param name="child">Child.</param>
        public override void AddView(Android.Views.View child)
        {
            try
            {
                var isMasterField = child.GetType().GetField("_isMaster", BindingFlags.NonPublic | BindingFlags.Instance);
                if (isMasterField == null) return;

                var isMaster = isMasterField.GetValue(child);
                if ((bool)isMaster) return;

                var parentField = child.GetType().GetField("_parent", BindingFlags.NonPublic | BindingFlags.Instance);
                if (parentField == null) return;

                var parent = parentField.GetValue(child) as MasterDetailPage;
                if (parent == null || !(parent.Parent is NavigationPage)) return;

                var topPaddingProperty = child.GetType().GetProperty("TopPadding", BindingFlags.Public | BindingFlags.Instance);
                if (topPaddingProperty != null)
                    topPaddingProperty.SetValue(child, 0);
            }
            finally
            {
                base.AddView(child);
            }
        }
    }
}
[程序集:ExportRenderer(typeof(MasterDetailPage)、typeof(NoSpaceMasterDetailPageRenderer))]
命名空间Droid.Renderers
{
公共类NoSpaceMasterDetailPageRenderer:MasterDetailPageRenderer
{
/// 
///添加视图时,如有必要,请调整顶部填充。
///根据:
/// https://github.com/xamarin/Xamarin.Forms/blob/589adbd3ef145ec85f9fe64eda008251c1cdb745/Xamarin.Forms.Platform.Android/AppCompat/MasterDetailPageRenderer.cs
///始终为详细信息设置TopPadding。当主详细信息正常显示时,此操作正常,但
///如果它位于导航页面(如“检查”视图)内,则会得到额外的多余填充。
///“修复”是将细节的顶部填充设置为0,当然只有类型和字段对我们隐藏。。。
/// 
///孩子。
public override void AddView(Android.Views.View子级)
{
尝试
{
var isMasterField=child.GetType().GetField(“_isMaster”,BindingFlags.NonPublic | BindingFlags.Instance);
如果(isMasterField==null)返回;
var isMaster=isMasterField.GetValue(子项);
如果((bool)isMaster)返回;
var parentField=child.GetType().GetField(“_parent”,BindingFlags.NonPublic | BindingFlags.Instance);
if(parentField==null)返回;
var parent=parentField.GetValue(子项)作为MasterDetailPage;
if(parent==null | |!(parent.parent为NavigationPage))返回;
var topPaddingProperty=child.GetType().GetProperty(“TopPadding”,BindingFlags.Public | BindingFlags.Instance);
if(topPaddingProperty!=null)
TopAddingProperty.SetValue(子级,0);
}
最后
{
base.AddView(子级);
}
}
}
}

您的
主页设置是什么?这是一个
导航页面
?如果是,请将其更改为
MasterDetailPage
,然后将master&detailpage改为
NavigationPage
s。您也可以尝试直接在表单中设置负数填充。可能不需要渲染器。我尝试了负填充,但它只将我的内容推到导航栏下,而不干扰空白空间。还有@JimBobBennett,我对你的答案很感兴趣,但我不太明白应该如何使用它。。。我认为渲染器应该放在Android项目中(而不是便携式项目中),因为它处理平台,但我如何使用它呢?很简单-只需将代码复制到Android项目中的cs文件中即可。
ExportRenderer
属性发挥了所有的魔力,使其工作。
App(NavigationPage)
    MainPage (ContentPage)
        LoginPage (ContentPage)
            HomePage (MasterDetailPage)
                HomeDetail(ContentPage)
        RegisterPage (ContentPage)
[assembly: ExportRenderer(typeof(MasterDetailPage), typeof(NoSpaceMasterDetailPageRenderer))]

namespace Droid.Renderers
{
    public class NoSpaceMasterDetailPageRenderer : MasterDetailPageRenderer
    {
        /// <summary>
        /// When adding a view, tweak the top padding if necessary.
        /// According to:
        /// https://github.com/xamarin/Xamarin.Forms/blob/589adbd3ef145ec85f9fe64eda008251c1cdb745/Xamarin.Forms.Platform.Android/AppCompat/MasterDetailPageRenderer.cs
        /// The TopPadding is always set for the detail. This works fine when the master detail is shown normally, but
        /// if it is inside a navigation page (such as the inspection view) then you get extra unwanted padding.
        /// The 'fix' is to set the top padding to 0 for the detail, only of course the types and fields are hidden from us...
        /// </summary>
        /// <param name="child">Child.</param>
        public override void AddView(Android.Views.View child)
        {
            try
            {
                var isMasterField = child.GetType().GetField("_isMaster", BindingFlags.NonPublic | BindingFlags.Instance);
                if (isMasterField == null) return;

                var isMaster = isMasterField.GetValue(child);
                if ((bool)isMaster) return;

                var parentField = child.GetType().GetField("_parent", BindingFlags.NonPublic | BindingFlags.Instance);
                if (parentField == null) return;

                var parent = parentField.GetValue(child) as MasterDetailPage;
                if (parent == null || !(parent.Parent is NavigationPage)) return;

                var topPaddingProperty = child.GetType().GetProperty("TopPadding", BindingFlags.Public | BindingFlags.Instance);
                if (topPaddingProperty != null)
                    topPaddingProperty.SetValue(child, 0);
            }
            finally
            {
                base.AddView(child);
            }
        }
    }
}