Uno-платформа: холст не в пикселях, но масштабируется чем-то

#uno-platform

#uno-платформа

Вопрос:

Uno говорит, что он «везде идеален для пикселей». Итак, я создал холст шириной 320 и высотой 320 и разместил внутри несколько кнопок, по одной на каждом краю.

Теперь, когда я запускаю приложение на Android или IOS, холст больше экрана, а кнопки с правой стороны вообще не отображаются.

Но у моего iPhone8 и моего Samsung S9 разрешение экрана намного больше, чем просто 320 на 320. Весь холст масштабируется чем-то, и даже границы окна главного окна намного меньше моего разрешения экрана.

Мои вопросы:

  1. Могу ли я отключить масштабирование и использовать реальное разрешение?
  2. Есть ли свойство, с помощью которого я могу получить коэффициенты масштабирования, чтобы я мог изменить размер своего холста и просто рассчитать все до масштабированного размера?

Ответ №1:

Значения компоновки, такие как Width и Height в Uno / WinUI Xaml, определяются в «логических пикселях», в отличие от «физических пикселей». Поскольку устройства с одинаковыми физическими размерами могут иметь сильно различающуюся физическую плотность пикселей, логические пиксели — лучший способ указать размеры макета в большинстве случаев.

Убедитесь, что вы понимаете систему компоновки Xaml — обычно вам вообще не следует жестко кодировать размеры, когда вы растягиваете содержимое на ширину экрана. Например:

     <Grid HorizontalAlignment="Stretch"
          Height="320">
        <Button Content="Button1"
                HorizontalAlignment="Left"
                VerticalAlignment="Top" />
        <Button Content="Button2"
                HorizontalAlignment="Right"
                VerticalAlignment="Top" />
        ...
    </Grid>
 

Все это говорит о том, что в очень редких случаях, когда вам нужно работать с физическими пикселями, зависящими от устройства, вы можете использовать DisplayInformation класс и его свойства, например:

             var displayInformation = DisplayInformation.GetForCurrentView();
            var scaleFactor = displayInformation.RawPixelsPerViewPixel;
            ...
 

Комментарии:

1. Спасибо, displayInformation помогло. Мое приложение, которое является чем-то вроде браузера для XML-описаний, поставляется из Windows CE, и я реализовал его для Android Mono с помощью RelativeLayout и Xamarin. Формы с AbsoluteLayout. Xamarin. Элементы формы выглядят абсолютно ужасно, поэтому я пришел в UNO. Теперь я могу использовать холст и просто размещать свои элементы. Все размеры и позиции будут рассчитываться приложением в зависимости от пикселей экрана и ориентации. Теперь мне просто нужно знать, почему событие изменения ориентации не срабатывает