[UWP] Explicitly set mobile StatusBar colors to white Background/black Foreground on Light theme (#491)

* [UWP] Encapsulate MobileStatusBar

* [UWP] Set StatusBar colors on Light theme

* Add test code to override status bar color
This commit is contained in:
Samantha Houts 2016-11-15 11:43:34 -08:00 коммит произвёл Jason Smith
Родитель 6bc6ee5c71
Коммит 0cc2fd2b67
4 изменённых файлов: 47 добавлений и 9 удалений

Просмотреть файл

@ -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>

Просмотреть файл

@ -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,6 +79,19 @@ namespace Xamarin.Forms.ControlGallery.WindowsUniversal
// parameter
rootFrame.Navigate(typeof(MainPage), e.Arguments);
}
//// 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();
}

Просмотреть файл

@ -193,6 +193,11 @@
<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>

Просмотреть файл

@ -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;