Не получается подгонять размеры интерфейса под разные экраны, сохранив пропорции
В таких пропорциях должно выглядеть на всех экранах
(2280х1080 dencity: 2.75):

Но на деле оно выглядит так на некоторых экранах:
(1920х1080 dencity: 2.56):

вот так задаю интерфейс и его размеры:
//половины размеров экрана
readonly double _dhalf_W = DeviceDisplay.MainDisplayInfo.Width * 0.5 * (DeviceDisplay.MainDisplayInfo.Density / 2.75) * (DeviceDisplay.MainDisplayInfo.Width/1080);
readonly double _dhalf_H = DeviceDisplay.MainDisplayInfo.Height * 0.5 * (DeviceDisplay.MainDisplayInfo.Density / 2.75) * (DeviceDisplay.MainDisplayInfo.Height / 2280);
private void Fill_root_StackLayout()
{
_root_StackLayout.Margin = new Thickness(_dhalf_W * 0.1, _dhalf_H * 0.23, _dhalf_W * 0.1, _dhalf_H * 0.143);
_root_StackLayout.Padding = new Thickness(_dhalf_W * 0.01, _dhalf_H * 0.01, _dhalf_W * 0.01, 0);
string[] texts = { "Уч. заведение", "Курс", "Факультет", "Направление" };
//добавить пикеры
for (int i = 0; i < 4; i++)
{
_pickers[i] = new Picker()
{
Title = texts[i].ToUpper(),
HorizontalOptions = LayoutOptions.CenterAndExpand,
//WidthRequest = _dhalf_W * 0.5,
WidthRequest = _dhalf_W * 0.5,
HeightRequest = _dhalf_H * 0.06,
Margin = new Thickness(0, 0, 0, 0),
TitleColor = Color.Green,
HorizontalTextAlignment = TextAlignment.Start,
AutomationId = $"{i}"
};
_pickers[i].SelectedIndexChanged += _pickers_SelectedIndexChanged;
_root_StackLayout.Children.Add(_pickers[i]);
}
//выключить ненужное
for (int i = 1; i < 4; i++)
{
_pickers[i].IsEnabled = false;
}
//добавить кнопку
_addToFavorites_Button = new Button()
{
Text = "Добавить",
WidthRequest = _dhalf_W * 0.2,
HeightRequest = _dhalf_H * 0.05,
BackgroundColor = new Color(0.188, 0.428, 0.916),
BorderColor = Color.Black,
BorderWidth = 1,
TextColor = Color.BlanchedAlmond,
TextTransform = TextTransform.Uppercase,
//Margin = new Thickness(0, 0, 0, 0),
VerticalOptions = LayoutOptions.End,
IsEnabled = false
};
_addToFavorites_Button.Clicked += _addToFavorites_Button_Clicked;
_root_StackLayout.Children.Add(_addToFavorites_Button);
}
В кратце, делаю это так:
readonly double _dhalf_W = DeviceDisplay.MainDisplayInfo.Width * 0.5 * (DeviceDisplay.MainDisplayInfo.Density / 2.75) * (DeviceDisplay.MainDisplayInfo.Width/1080);
readonly double _dhalf_H = DeviceDisplay.MainDisplayInfo.Height * 0.5 * (DeviceDisplay.MainDisplayInfo.Density / 2.75) * (DeviceDisplay.MainDisplayInfo.Height / 2280);
- вычисляю условные единицы интерфейса, далее просто умножаю их на число, выбранное методом подбора, и указываю это как размер чего-нибудь в интерфейсе.
Как я понял, этот способ не работает, т.к. у экранов разная челка, разные размеры панели навигации, разные размеры панели уведомлений. Может можно как-нибудь получить размер окна, который дается системой на интерфейс приложения? Ну или какие еще способы подгона интерфейса под экран есть?
UPD:
readonly double _dhalf_W = DeviceDisplay.MainDisplayInfo.Width * 0.5;
readonly double _dhalf_H = DeviceDisplay.MainDisplayInfo.Height *0.5;
вот так пропорции интерфейса становятся одинаковыми везде, но только при условии что в настройках для разработчиков Smallest width поставлена на по умолчанию. но ведь люди ее часто меняют на свою, и интерфейс у них поплывет.