Получить текущую ширину экрана в форме xamarin

Я создаю один проект Xamarin Forms, и я застрял в поиске текущей ширины экрана в соответствии с другим устройством.

Я знаю, как это можно сделать в Android и ios, но нужно найти ширину в переносном.

Ответ 1

Вы можете попробовать этот Application.Current.MainPage.Width в моем случае это сработало, и я могу найти ширину устройства в самом портативном проекте.

Ответ 2

Общий код (в App.xaml.cs)

public static int ScreenHeight {get; set;}
public static int ScreenWidth {get; set;}

часть Android (в MainActivity.cs, в методе OnCreate)

App.ScreenHeight = (int) (Resources.DisplayMetrics.HeightPixels / Resources.DisplayMetrics.Density);
App.ScreenWidth = (int) (Resources.DisplayMetrics.WidthPixels / Resources.DisplayMetrics.Density);

часть iOS (в приложении AppDelegate.cs, в методе FinishedLaunching)

App.ScreenHeight = (int)UIScreen.MainScreen.Bounds.Height;
App.ScreenWidth = (int)UIScreen.MainScreen.Bounds.Width;

Итак, App.ScreenHeight и App.ScreenWidth будут инициализированы, когда приложение будет запущено, тогда вы сможете использовать их в любом месте общего кода.

Ответ 3

Я знаю, что это старая ветка, но стоит упомянуть, что недавно был выпущен пакет Xamarin.Essentials NuGet, и там есть полезный класс DeviceDisplay, который должен решить эту задачу для вас.

Документацию можно найти здесь.

Пример использования:

// Get Metrics
var mainDisplayInfo = DeviceDisplay.MainDisplayInfo;

// Orientation (Landscape, Portrait, Square, Unknown)
var orientation = mainDisplayInfo.Orientation;

// Rotation (0, 90, 180, 270)
var rotation = mainDisplayInfo.Rotation;

// Width (in pixels)
var width = mainDisplayInfo.Width;

// Height (in pixels)
var height = mainDisplayInfo.Height;

// Screen density
var density = mainDisplayInfo.Density;

Ответ 4

Вы можете использовать свойство Width, когда находитесь в ContentPage. Например,

protected override void OnAppearing()
{
    base.OnAppearing();
    double w = this.Width;
}

Обратите внимание, что это устанавливается на этапе макета. Таким образом, вы можете использовать его только после инициализации страницы, в противном случае это -1.

https://developer.xamarin.com/api/property/Xamarin.Forms.VisualElement.Width/

Ответ 5

Я бы создал статическую структуру в общем коде, чтобы я мог легко получать доступ к значениям ширины/высоты экрана (а также делать привязки в xAML)

Структура в пространстве имен приложения (например, в App.xaml.cs):

using System;
using Xamarin.Forms;

namespace YourAppName
{

    ...

    public struct Constant
    {
        public static double ScreenWidth = Application.Current.MainPage.Width;
        public static double ScreenHeight = Application.Current.MainPage.Height;
    }
}

получение ширины экрана в С#:

var labelWidth = Constant.ScreenHeight * 0.2;
// then do something with labelWidth

Получение ширины экрана в XAML:

<Label Text="Text with insane font size" FontSize="{Binding Source={x:Static local:Constant.ScreenWidth}}"/>

Ответ 6

Другим подходом было бы использовать переопределение "OnSizeAllocated" для вашей страницы, а затем взять высоту и ширину в соответствии с изменениями на экране пользователя. Вы можете создать статический класс, чтобы каждый раз устанавливать высоту и ширину экрана, а затем получать доступ к ним из этого класса, когда это необходимо.

Статический класс для установки и доступа к размеру устройства:

public static class ScreenDimensions
{
    public static double Height { get; set; }
    public static double Width { get; set; }
}

Отменить, чтобы получить размеры экрана:

protected override void OnSizeAllocated(double width, double height)
{
    base.OnSizeAllocated(width, height);
    ScreenDimensions.Height = height;
    ScreenDimensions.Width = width;
}

Ответ 7

Я предполагаю, что лучший способ - использовать информацию xamarin.forms.Device.

               Size size = Device.Info.PixelScreenSize;

            if (size.Width <= 720 && size.Height <= 1280)
            {
                stkLayoutTop.Margin = new Thickness(5, 30, 10, 0);
            }
            else
            {
                stkLayoutTop.Margin = new Thickness(5, 50, 10, 0);
            }