How to get/detect screen size in Xamarin.Forms?

前端 未结 6 810
[愿得一人]
[愿得一人] 2020-12-08 22:24

I am trying to rewrite an app that I wrote for iOS. I was going to write an android version but thought It\'d be better to make this the opportunity to use Xamarin.Forms. Do

6条回答
  •  野趣味
    野趣味 (楼主)
    2020-12-08 22:34

    There isn't currently a way from Xamarin.Forms itself but we have it implemented as PCL compatible interface in Xamarin.Forms.Labs which you can get from NuGet or source code from GitHub.

    https://github.com/XForms/Xamarin-Forms-Labs

    IDevice has IDisplay property with the information; height, width, pixel density for X & Y and couple of extension methods to calculate sized in inches.

    Sample page for getting information from the device:

    https://github.com/XForms/Xamarin-Forms-Labs/blob/master/samples/Xamarin.Forms.Labs.Sample/Pages/Services/ExtendedDeviceInfoPage.cs

            #region Display information
            var display = device.Display;
            var displayFrame = new Frame();
            if (display != null)
            {
                displayFrame.Content = new StackLayout()
                {
                    Children =
                    {
                        new Label() { Text = display.ToString() },
                        new Label() { Text = string.Format("Screen width is\t {0:0.0} inches.", display.ScreenWidthInches()) },
                        new Label() { Text = string.Format("Screen height is\t {0:0.0} inches.", display.ScreenHeightInches()) },
                        new Label() { Text = string.Format("Screen diagonal size is\t {0:0.0} inches.", display.ScreenSizeInches()) }
                                }
                            };
            }
            else
            {
                displayFrame.Content = new Label() { TextColor = Color.Red, Text = "Device does not contain display information." };
            }
    
            stack.Children.Add(displayFrame); 
            #endregion
    

    Creating an exact inch-by-inch frame on all platforms regardless of display properties:

    https://github.com/XForms/Xamarin-Forms-Labs/blob/master/samples/Xamarin.Forms.Labs.Sample/Pages/Services/AbsoluteLayoutWithDisplayInfoPage.cs

    public class AbsoluteLayoutWithDisplayInfoPage : ContentPage
    {
        public AbsoluteLayoutWithDisplayInfoPage(IDisplay display)
        {
            this.Title = "Absolute Layout With Display Info";
            var abs = new AbsoluteLayout();
            var inchX = display.WidthRequestInInches(1);
            var inchY = display.HeightRequestInInches(1);
            var originX = display.WidthRequestInInches(display.ScreenWidthInches() / 2);
            var originY = display.HeightRequestInInches(display.ScreenHeightInches() / 2);
    
            abs.Children.Add(new Label() { Text = "1\"x\"1\" blue frame" });
    
            abs.Children.Add(new Frame()
                {
                    BackgroundColor = Color.Navy,
                },
                new Rectangle(originX - inchX/2, originY - inchY/2, inchX, inchY));
    
            abs.Children.Add(new Frame()
                {
                    BackgroundColor = Color.White
                },
                new Rectangle(originX - inchX/16, originY - inchY/16, inchX/8, inchY/8));
    
            this.Content = abs;
        }
    }
    

    To get to the device info either set your DI resolver or use a static container. All 3 platforms have a singleton device calls with static CurrentDevice property:

    resolverContainer.Register(t => WindowsPhoneDevice.CurrentDevice)
    resolverContainer.Register(t => AppleDevice.CurrentDevice)
    resolverContainer.Register(t => AndroidDevice.CurrentDevice)
    

提交回复
热议问题