Как получить/определить размер экрана в Xamarin.Forms?

Я пытаюсь переписать приложение, которое я написал для iOS. Я собирался написать версию для Android, но подумал, что было бы лучше сделать это возможностью использовать Xamarin.Forms. Выполняя одну страницу за раз, теперь я застрял на странице, где мне нужно получить ширину и высоту экрана. Кто-нибудь знает эквивалент iOS 'View.Frame.Width в Xamarin.Forms?

Ответы

Ответ 1

В настоящее время нет пути от Xamarin.Forms, но мы реализовали его как совместимый с PCL интерфейс в Xamarin.Forms.Labs, который вы можете получить из 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

Создание точной рамки дюймов на дюйм на всех платформах, независимо от свойств отображения:

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)

Ответ 2

Обновление: вы можете использовать пакет Nuget Xamarin.Essentials для этой и многих других целей.

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

Старый ответ:

Существует простой способ узнать ширину и высоту экрана в Xamarin.Forms и получить к нему глобальный доступ из Xamarin.Forms вашего приложения. Я бы сделал что-то вроде этого:

1. Создайте два открытых члена в вашем App.cs:

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

2. Установите значения в MainActivity.cs (Android) или AppDelegate.cs (iOS):

Android:

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;

    ...
}

Ответ 3

Если вы используете формы xamarin, вы можете найти ширину и высоту текущего экрана в переносимой библиотеке классов (pcl), как показано ниже.

Для Width вы используете это в pcl,

Application.Current.MainPage.Width

Для высоты вы можете сделать это в pcl,

Application.Current.MainPage.Height

Ответ 4

Рецепт

Создайте новое приложение Xamarin.Android с именем ScreenSize. Измените 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>
  • Отредактируйте Activity1.cs, измените код в OnCreate на следующее:

    ! [введите описание изображения здесь] [1] private int ConvertPixelsToDp (float pixelValue) {   var dp = (int) ((pixelValue)/Resources.DisplayMetrics.Density);   return dp; }

  • Запустите приложение. В зависимости от устройства он отображает высоту и ширину экрана. Следующий снимок экрана сделан из Galaxy Nexus:

[ссылка на изображение] http://i.stack.imgur.com/TQhba.png

Ответ 5

В вашем файле приложения укажите общедоступную статическую переменную

public static Size ScreenSize;

Вы должны инициализировать переменную как в IOS, так и в Android перед вызовом конструктора App. Для 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));

Ответ 6

Обновление для будущих разработчиков, пытающихся сделать это, которые либо не смотрели, либо пропустили. Класс 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;
}

ссылка: Microsoft Документы