diff options
Diffstat (limited to 'Xamarin.Forms.Platform.WinRT/WindowsDeviceInfo.cs')
-rw-r--r-- | Xamarin.Forms.Platform.WinRT/WindowsDeviceInfo.cs | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/Xamarin.Forms.Platform.WinRT/WindowsDeviceInfo.cs b/Xamarin.Forms.Platform.WinRT/WindowsDeviceInfo.cs new file mode 100644 index 00000000..f3d6d100 --- /dev/null +++ b/Xamarin.Forms.Platform.WinRT/WindowsDeviceInfo.cs @@ -0,0 +1,110 @@ +using System; +using Windows.Foundation; +using Windows.Graphics.Display; +using Windows.UI.Xaml; + +#if WINDOWS_UWP + +namespace Xamarin.Forms.Platform.UWP +#else + +namespace Xamarin.Forms.Platform.WinRT +#endif +{ + internal class WindowsDeviceInfo : DeviceInfo + { + DisplayInformation _information; + bool _isDisposed; + + public WindowsDeviceInfo() + { + // TODO: Screen size and DPI can change at any time + _information = DisplayInformation.GetForCurrentView(); + _information.OrientationChanged += OnOrientationChanged; + CurrentOrientation = GetDeviceOrientation(_information.CurrentOrientation); + } + + public override Size PixelScreenSize + { + get + { + double scaling = ScalingFactor; + Size scaled = ScaledScreenSize; + double width = Math.Round(scaled.Width * scaling); + double height = Math.Round(scaled.Height * scaling); + + return new Size(width, height); + } + } + + public override Size ScaledScreenSize + { + get + { + Rect windowSize = Window.Current.Bounds; + return new Size(windowSize.Width, windowSize.Height); + } + } + + public override double ScalingFactor + { + get + { + ResolutionScale scale = _information.ResolutionScale; + switch (scale) + { + case ResolutionScale.Scale120Percent: + return 1.2; + case ResolutionScale.Scale140Percent: + return 1.4; + case ResolutionScale.Scale150Percent: + return 1.5; + case ResolutionScale.Scale160Percent: + return 1.6; + case ResolutionScale.Scale180Percent: + return 1.8; + case ResolutionScale.Scale225Percent: + return 2.25; + case ResolutionScale.Scale100Percent: + default: + return 1; + } + } + } + + protected override void Dispose(bool disposing) + { + if (_isDisposed) + return; + + _isDisposed = true; + _information.OrientationChanged -= OnOrientationChanged; + _information = null; + + base.Dispose(disposing); + } + + static DeviceOrientation GetDeviceOrientation(DisplayOrientations orientations) + { + switch (orientations) + { + case DisplayOrientations.Landscape: + case DisplayOrientations.LandscapeFlipped: + return DeviceOrientation.Landscape; + + case DisplayOrientations.Portrait: + case DisplayOrientations.PortraitFlipped: + return DeviceOrientation.Portrait; + + default: + case DisplayOrientations.None: + return DeviceOrientation.Other; + } + } + + void OnOrientationChanged(DisplayInformation sender, object args) + { + CurrentOrientation = GetDeviceOrientation(sender.CurrentOrientation); + } + } +}
\ No newline at end of file |