Не получается подгонять размеры интерфейса под разные экраны, сохранив пропорции

В таких пропорциях должно выглядеть на всех экранах (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 поставлена на по умолчанию. но ведь люди ее часто меняют на свою, и интерфейс у них поплывет.


Ответы (0 шт):