如何使用 AppShell 更改 Xamarin Forms ContentPage 中的状态栏?

sar*_*lva 1 xamarin.forms

我正在使用新概念AppShell,并且我正在执行以下流程

    App.MainPage = new AppShell();
Run Code Online (Sandbox Code Playgroud)

那我就做

    protected async override void OnStart()
    {
        await Shell.Current.GoToAsync($"//{nameof(LoginPage)}");
    }
Run Code Online (Sandbox Code Playgroud)

有了这个,我有一个 ForgetPasswordPage,来自 LoginViewModel 我做

   await Shell.Current.GoToAsync($"//{nameof(ForgetPasswordPage)}");
Run Code Online (Sandbox Code Playgroud)

重点是如果我这样做

    var color = new Color(33, 150, 243);
    Xamarin.Essentials.Platform.CurrentActivity.Window.SetStatusBarColor(color);
Run Code Online (Sandbox Code Playgroud)

在 Android 的 Create 方法中,StatusBar 具有我定义的颜色。那么iOS的方法在哪里呢?

我尝试了这些解决方案

没有成功...

有人可以解释如何更改状态代码,但我想将其设置在我的 ContentPage 中,我可以使用样式或像这样的简单代码行

Xamarin.Essentials.Platform.CurrentActivity.Window.SetStatusBarColor(颜色);

Android项目中使用的。

我按照其他帖子中的步骤进行操作,得到:

Foundation.MonoTouchException: '抛出 Objective-C 异常。名称:NSInternalInconsistencyException 原因:应用程序在 UIApplication 上调用了 -statusBar 或 -statusBarWindow:必须更改此代码,因为不再有状态栏或状态栏窗口。请改用窗口场景上的 statusBarManager 对象。本机堆栈跟踪:0 CoreFoundation 0x00007fff20422fba __exceptionPreprocess + 242

System.Reflection.TargetInitationException Message=调用目标已引发异常

Jam*_*gno 5

您可以在这里观看我的视频,其中详细介绍了:https://www.youtube.com/watch?v =GKJRR8_DSSs

一般来说:

安卓 -

        public void SetStatusBarColor(System.Drawing.Color color, bool darkStatusBarTint)
        {
            if (Build.VERSION.SdkInt < Android.OS.BuildVersionCodes.Lollipop)
                return;

            var activity = Platform.CurrentActivity;
            var window = activity.Window;
            window.AddFlags(Android.Views.WindowManagerFlags.DrawsSystemBarBackgrounds);
            window.ClearFlags(Android.Views.WindowManagerFlags.TranslucentStatus);
            window.SetStatusBarColor(color.ToPlatformColor());

            if (Build.VERSION.SdkInt >= Android.OS.BuildVersionCodes.M)
            {
                var flag = (Android.Views.StatusBarVisibility)Android.Views.SystemUiFlags.LightStatusBar;
                window.DecorView.SystemUiVisibility = darkStatusBarTint ? flag : 0;
            }
        }
Run Code Online (Sandbox Code Playgroud)

iOS:

 public void SetStatusBarColor(System.Drawing.Color color, bool darkStatusBarTint)
        {
            if (UIDevice.CurrentDevice.CheckSystemVersion(13, 0))
            {
                var statusBar = new UIView(UIApplication.SharedApplication.KeyWindow.WindowScene.StatusBarManager.StatusBarFrame);
                statusBar.BackgroundColor = color.ToPlatformColor();
                UIApplication.SharedApplication.KeyWindow.AddSubview(statusBar);
            }
            else
            {
                var statusBar = UIApplication.SharedApplication.ValueForKey(new NSString("statusBar")) as UIView;
                if (statusBar.RespondsToSelector(new ObjCRuntime.Selector("setBackgroundColor:")))
                {
                    statusBar.BackgroundColor = color.ToPlatformColor();
                }
            }
            var style = darkStatusBarTint ? UIStatusBarStyle.DarkContent : UIStatusBarStyle.LightContent;
            UIApplication.SharedApplication.SetStatusBarStyle(style, false);
            Xamarin.Essentials.Platform.GetCurrentUIViewController()?.SetNeedsStatusBarAppearanceUpdate();
        }
Run Code Online (Sandbox Code Playgroud)