[UWP] Explicitly set mobile StatusBar colors to white Background/black Foreground...
authorSamantha Houts <samantha@teamredwall.com>
Tue, 15 Nov 2016 19:43:34 +0000 (11:43 -0800)
committerJason Smith <jason.smith@xamarin.com>
Tue, 15 Nov 2016 19:43:34 +0000 (11:43 -0800)
* [UWP] Encapsulate MobileStatusBar

* [UWP] Set StatusBar colors on Light theme

* Add test code to override status bar color

Xamarin.Forms.ControlGallery.WindowsUniversal/App.xaml
Xamarin.Forms.ControlGallery.WindowsUniversal/App.xaml.cs
Xamarin.Forms.ControlGallery.WindowsUniversal/Xamarin.Forms.ControlGallery.WindowsUniversal.csproj
Xamarin.Forms.Platform.WinRT/Platform.cs

index 89b2c56..d114d1a 100644 (file)
@@ -2,7 +2,8 @@
     x:Class="Xamarin.Forms.ControlGallery.WindowsUniversal.App"
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
-    xmlns:local="using:Xamarin.Forms.ControlGallery.WindowsUniversal">
+    xmlns:local="using:Xamarin.Forms.ControlGallery.WindowsUniversal"
+       RequestedTheme="Light">
 
 
 </Application>
index 6253644..e53b666 100644 (file)
@@ -7,6 +7,9 @@ using Windows.ApplicationModel;
 using Windows.ApplicationModel.Activation;
 using Windows.Foundation;
 using Windows.Foundation.Collections;
+using Windows.Foundation.Metadata;
+using Windows.UI;
+using Windows.UI.ViewManagement;
 using Windows.UI.Xaml;
 using Windows.UI.Xaml.Controls;
 using Windows.UI.Xaml.Controls.Primitives;
@@ -76,8 +79,21 @@ namespace Xamarin.Forms.ControlGallery.WindowsUniversal
                 // parameter
                 rootFrame.Navigate(typeof(MainPage), e.Arguments);
             }
-            // Ensure the current window is active
-            Window.Current.Activate();
+
+                       //// Uncomment to test overriding the status bar color
+                       //if (ApiInformation.IsTypePresent("Windows.UI.ViewManagement.StatusBar"))
+                       //{
+                       //      var statusBar = StatusBar.GetForCurrentView();
+                       //      if (statusBar != null)
+                       //      {
+                       //              statusBar.BackgroundOpacity = 1;
+                       //              statusBar.BackgroundColor = Colors.Black;
+                       //              statusBar.ForegroundColor = Colors.White;
+                       //      }
+                       //}
+
+                       // Ensure the current window is active
+                       Window.Current.Activate();
         }
 
         /// <summary>
index 217fa0a..7f0162f 100644 (file)
       <SubType>Designer</SubType>
     </Page>
   </ItemGroup>
+  <ItemGroup>
+    <SDKReference Include="WindowsMobile, Version=10.0.10586.0">
+      <Name>Windows Mobile Extensions for the UWP</Name>
+    </SDKReference>
+  </ItemGroup>
   <PropertyGroup Condition=" '$(VisualStudioVersion)' == '' or '$(VisualStudioVersion)' &lt; '14.0' ">
     <VisualStudioVersion>14.0</VisualStudioVersion>
   </PropertyGroup>
index e5a989c..d6a68fe 100644 (file)
@@ -32,6 +32,10 @@ namespace Xamarin.Forms.Platform.WinRT
        {
                internal static readonly BindableProperty RendererProperty = BindableProperty.CreateAttached("Renderer", typeof(IVisualElementRenderer), typeof(Platform), default(IVisualElementRenderer));
 
+#if WINDOWS_UWP
+               internal static StatusBar MobileStatusBar => ApiInformation.IsTypePresent("Windows.UI.ViewManagement.StatusBar") ? StatusBar.GetForCurrentView() : null;
+#endif
+
                public static IVisualElementRenderer GetRenderer(VisualElement element)
                {
                        return (IVisualElementRenderer)element.GetValue(RendererProperty);
@@ -79,13 +83,26 @@ namespace Xamarin.Forms.Platform.WinRT
 
                        UpdateBounds();
 
-
 #if WINDOWS_UWP
-                       if (ApiInformation.IsTypePresent("Windows.UI.ViewManagement.StatusBar"))
+                       StatusBar statusBar = MobileStatusBar;
+                       if (statusBar != null)
                        {
-                               StatusBar statusBar = StatusBar.GetForCurrentView();
                                statusBar.Showing += (sender, args) => UpdateBounds();
                                statusBar.Hiding += (sender, args) => UpdateBounds();
+
+                               // UWP 14393 Bug: If RequestedTheme is Light (which it is by default), then the 
+                               // status bar uses White Foreground with White Background. 
+                               // UWP 10586 Bug: If RequestedTheme is Light (which it is by default), then the 
+                               // status bar uses Black Foreground with Black Background. 
+                               // Since the Light theme should have a Black on White status bar, we will set it explicitly. 
+                               // This can be overriden by setting the status bar colors in App.xaml.cs OnLaunched.
+
+                               if (statusBar.BackgroundColor == null && statusBar.ForegroundColor == null && Windows.UI.Xaml.Application.Current.RequestedTheme == ApplicationTheme.Light)
+                               {
+                                       statusBar.BackgroundColor = Colors.White;
+                                       statusBar.ForegroundColor = Colors.Black;
+                                       statusBar.BackgroundOpacity = 1;
+                               }
                        }
 #endif
                }
@@ -420,10 +437,9 @@ namespace Xamarin.Forms.Platform.WinRT
                {
                        _bounds = new Rectangle(0, 0, _page.ActualWidth, _page.ActualHeight);
 #if WINDOWS_UWP
-                       if (ApiInformation.IsTypePresent("Windows.UI.ViewManagement.StatusBar"))
+                       StatusBar statusBar = MobileStatusBar;
+                       if (statusBar != null)
                        {
-                               StatusBar statusBar = StatusBar.GetForCurrentView();
-
                                bool landscape = Device.Info.CurrentOrientation.IsLandscape();
                                bool titleBar = CoreApplication.GetCurrentView().TitleBar.IsVisible;
                                double offset = landscape ? statusBar.OccludedRect.Width : statusBar.OccludedRect.Height;