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

时间:2014-06-28 09:40:38

标签: android ios xamarin.ios xamarin xamarin.forms

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

6 个答案:

答案 0 :(得分:30)

更新:您可以使用Xamarin.Essentials nuget包进行此操作以及其他许多用途。

var width = DeviceDisplay.MainDisplayInfo.Width;
var height = DeviceDisplay.MainDisplayInfo.Height;

旧回答:

有一种简单的方法可以在Xamarin.Forms中获取屏幕的宽度和高度,并从应用中的任何位置全局访问它。我会做这样的事情:

<强> 1。在App.cs中创建两个公共成员:

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;

    ...
}

答案 1 :(得分:6)

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

对于Width,您可以在pcl中使用它,

Application.Current.MainPage.Width

对于身高,您可以在pcl,

中执行此操作
Application.Current.MainPage.Height

答案 2 :(得分:4)

目前还没有一种来自Xamarin.Forms本身的方法,但我们将它实现为Xamarin.Forms.Labs中的PCL兼容接口,您可以从NuGet获取或从GitHub获取源代码。

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

IDevice具有IDisplay属性及其信息; X&amp;的高度,宽度,像素密度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

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

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

要获取设备信息,请设置DI解析器或使用静态容器。所有3个平台都具有带静态CurrentDevice属性的单例设备调用:

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

答案 3 :(得分:1)

配方

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

<?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中的代码更改为以下内容:

    ![在此处输入图片说明] [1] private int ConvertPixelsToDp(float pixelValue) {     var dp =(int)((pixelValue)/Resources.DisplayMetrics.Density);     返回dp; }

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

  3. [图片链接] http://i.stack.imgur.com/TQhba.png

答案 4 :(得分:1)

在App文件中定义一个公共静态变量

public static Size ScreenSize;

在调用App constructer之前,您应该在IOS和Android中初始化变量。对于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));

答案 5 :(得分:0)

更新未来的开发人员试图做到这一点,或者看不到或错过它。 Page类继承自VisualElement,它现在有两个属性(碰巧可绑定在XAML中使用):

  

宽度 - 获取此元素的当前渲染宽度。这是一个只读的可绑定属性。   高度 - 获取此元素的当前渲染高度。这是一个只读的可绑定属性。

在您的网页代码隐藏中,您只需执行以下操作:

var myWidth = this.Width;
var myHeight = this.Height;

如果您需要知道它是否发生变化,请使用SizeChanged事件:

public MyPage()
{
    SizeChanged += OnSizeChanged;
}

private void OnSizeChanged(object sender, EventArgs e)
{
    var myWidth = this.Width;
    var myHeight = this.Height;
}

ref: Microsoft Docs