Как получить/определить размер экрана в 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 Документы