From 76c8c57fb30621272e19d493787836ed8c322b9d Mon Sep 17 00:00:00 2001 From: Paul DiPietro Date: Tue, 12 Apr 2016 11:15:21 -0700 Subject: [UWP] Adjust bounds for ContentPage when by itself (#61) In a scenario where there is a ContentPage by itself, things like labels ran beneath the StatusBar in landscape mode. This is presumably because the page was assuming there to be a TitleBar and calculating the bounds based on that fact; by checking for its visibility and adjusting the bounds as necessary it allows for correct alignment. --- .../Bugzilla40185.cs | 47 ++++++++++++++++++++++ .../Xamarin.Forms.Controls.Issues.Shared.projitems | 1 + Xamarin.Forms.Platform.WinRT/Platform.cs | 11 +++++ 3 files changed, 59 insertions(+) create mode 100644 Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla40185.cs diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla40185.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla40185.cs new file mode 100644 index 00000000..d6f17d9d --- /dev/null +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla40185.cs @@ -0,0 +1,47 @@ +using System; + +using Xamarin.Forms.CustomAttributes; + +#if UITEST +using Xamarin.UITest; +using NUnit.Framework; +#endif + +namespace Xamarin.Forms.Controls.Issues +{ + [Preserve(AllMembers = true)] + [Issue(IssueTracker.Bugzilla, 40185, "[UWP] ContentPage does not have proper right bounds in landscape", PlatformAffected.WinRT)] + public class Bugzilla40185 : TestContentPage + { + protected override void Init() + { + Content = new StackLayout + { + VerticalOptions = LayoutOptions.Center, + Children = + { + new Button + { + Text = "Switch Main Page", + Command = new Command(SwitchMainPage) + } + } + }; + } + + void SwitchMainPage() + { + Application.Current.MainPage = new ContentPage + { + BackgroundColor = Color.White, + Content = new Label + { + Text = "This text should be in bounds in landscape mode.", + HorizontalTextAlignment = TextAlignment.End, + VerticalTextAlignment = TextAlignment.Center, + TextColor = Color.Black + } + }; + } + } +} diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems index c8874940..ca43a273 100644 --- a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems @@ -97,6 +97,7 @@ + diff --git a/Xamarin.Forms.Platform.WinRT/Platform.cs b/Xamarin.Forms.Platform.WinRT/Platform.cs index dbef5f7d..012dd2c4 100644 --- a/Xamarin.Forms.Platform.WinRT/Platform.cs +++ b/Xamarin.Forms.Platform.WinRT/Platform.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using Windows.ApplicationModel.Core; using Windows.UI; using Windows.UI.Popups; using Windows.UI.Xaml; @@ -421,9 +422,19 @@ namespace Xamarin.Forms.Platform.WinRT 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; _bounds = new Rectangle(0, 0, _page.ActualWidth - (landscape ? offset : 0), _page.ActualHeight - (landscape ? 0 : offset)); + + // Even if the MainPage is a ContentPage not inside of a NavigationPage, the calculated bounds + // assume the TitleBar is there even if it isn't visible. When UpdatePageSizes is called, + // _container.ActualWidth is correct because it's aware that the TitleBar isn't there, but the + // bounds aren't, and things can subsequently run under the StatusBar. + if (!titleBar) + { + _bounds.Width -= (_bounds.Width - _container.ActualWidth); + } } #endif } -- cgit v1.2.3