如何获取/检测Xamarin.Forms中的屏幕大小?

我正在尝试重写我为iOS编写的应用程序。 我打算写一个android版本,但认为这将是更好的使这个机会来使用Xamarin.Forms。 一次做一页,现在我被卡在一个页面,我需要获得屏幕的宽度和高度。 有没有人知道Xamarin.Forms iOS中的View.Frame.Width的等价物?

目前还没有Xamarin.Forms方式的一种方式,但是我们已经在Xamarin.Forms.Labs中实现了PCL兼容接口,你可以从NuGet中获得它,或者从GitHub获得源代码。

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

IDevice具有该信息的IDisplay属性; X和Y的高度,宽度,像素密度和几个扩展方法来计算大小,以英寸为单位。

从设备获取信息的示例页面:

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 

在所有平台上创build精确的逐英寸框架,无论显示属性如何:

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

要获得设备信息,请设置您的DIparsing器或使用静态容器。 所有3个平台都有一个带有静态CurrentDevice属性的单例设备调用:

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

有一个简单的方法来获取屏幕的宽度和高度在Xamarin.Forms并从您的应用程序全局访问它。 我会做这样的事情:

1.在App.cs中创build两个公共成员:

 public static class App { public static int ScreenWidth; public static int ScreenHeight; ... } 

2.在 MainActivity.cs (Android)或 AppDelegate.cs (iOS)中 设置值

安卓:

 protected override void OnCreate(Bundle bundle) { ... App.ScreenWidth = (int)Resources.DisplayMetrics.WidthPixels; // real pixels App.ScreenHeight = (int)Resources.DisplayMetrics.HeightPixels; // real pixels // App.ScreenWidth = (int)(Resources.DisplayMetrics.WidthPixels / Resources.DisplayMetrics.Density); // device independent pixels // App.ScreenHeight = (int)(Resources.DisplayMetrics.HeightPixels / Resources.DisplayMetrics.Density); // device independent pixels ... } 

iOS版:

 public override bool FinishedLaunching(UIApplication app, NSDictionary options) { ... App.ScreenWidth = (int)UIScreen.MainScreen.Bounds.Width; App.ScreenHeight = (int)UIScreen.MainScreen.Bounds.Height; ... } 

如果您使用的是xamarin格式,那么您可以在下面的便携式类库(pcl)中find当前屏幕的宽度和高度。

对于你在pcl中使用的宽度,

 Application.Current.MainPage.Width 

对于身高,你可以在pcl中做到这一点,

 Application.Current.MainPage.Height 

食谱

创build一个名为ScreenSize的新的Xamarin.Android应用程序。 编辑Main.axml,使其包含两个TextViews:

 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:text="Screen Width:" android:textAppearance="?android:attr/textAppearanceLarge" android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/screenWidthDp" /> <TextView android:text="Screen Height:" android:textAppearance="?android:attr/textAppearanceLarge" android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/screenHeightDp" /> </LinearLayout> 
  1. 编辑Activity1.cs,将OnCreate中的代码更改为以下内容:

    [int] ConvertPixelsToDp(float pixelValue){var dp =(int)((pixelValue)/Resources.DisplayMetrics.Density); 返回dp; }

  2. 运行应用程序。 根据设备,它将显示屏幕的高度和宽度。 以下屏幕截图来自Galaxy Nexus:

[图片链接] http://img.androidcookie.com/android/TQhba.png

在你的App文件中定义一个公共静态variables

 public static Size ScreenSize; 

在调用App构造器之前,你应该在IOS和Android中初始化variables。 对于IOS,在FinishedLaunching方法中

 App.ScreenSize = new Size(UIScreen.MainScreen.Bounds.Width, UIScreen.MainScreen.Bounds.Height); 

而对于Android,则在OnCreate函数中

  App.ScreenSize = new Xamarin.Forms.Size((int)(Resources.DisplayMetrics.WidthPixels / Resources.DisplayMetrics.Density), (int)(Resources.DisplayMetrics.HeightPixels / Resources.DisplayMetrics.Density));