Я создаю один проект Xamarin Forms, и я застрял в поиске текущей ширины экрана в соответствии с другим устройством.
Я знаю, как это можно сделать в Android и ios, но нужно найти ширину в переносном.
Я создаю один проект Xamarin Forms, и я застрял в поиске текущей ширины экрана в соответствии с другим устройством.
Я знаю, как это можно сделать в Android и ios, но нужно найти ширину в переносном.
Вы можете попробовать этот Application.Current.MainPage.Width
в моем случае это сработало, и я могу найти ширину устройства в самом портативном проекте.
Общий код (в 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 будут инициализированы, когда приложение будет запущено, тогда вы сможете использовать их в любом месте общего кода.
Я знаю, что это старая ветка, но стоит упомянуть, что недавно был выпущен пакет 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;
Вы можете использовать свойство Width, когда находитесь в ContentPage. Например,
protected override void OnAppearing()
{
base.OnAppearing();
double w = this.Width;
}
Обратите внимание, что это устанавливается на этапе макета. Таким образом, вы можете использовать его только после инициализации страницы, в противном случае это -1.
https://developer.xamarin.com/api/property/Xamarin.Forms.VisualElement.Width/
Я бы создал статическую структуру в общем коде, чтобы я мог легко получать доступ к значениям ширины/высоты экрана (а также делать привязки в 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}}"/>
Другим подходом было бы использовать переопределение "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;
}
Я предполагаю, что лучший способ - использовать информацию 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);
}