Uno-platform:Canvas 不是以像素为单位,而是按比例缩放

Uno-platform: Canvas not in pixel but scaled by something

Uno 说是 'Pixel Perfect Everywhere'。 所以我创建了一个宽度为 320 高度为 320 的 canvas 并在里面放置了一些按钮,每边一个。

现在当我启动应用程序时,在 Android 或 IOS 上, canvas 比屏幕大,右侧的按钮根本不显示.

但是我的 iPhone8 和三星 S9 的屏幕分辨率比 320 x 320 大得多。 整个 canvas 被某种东西缩放了,甚至主 window 的 window 边界也远小于我的屏幕分辨率。

我的问题:

  1. 我可以关闭缩放并使用实际分辨率吗?
  2. 是否有一个 属性 可以让我获得比例因子,这样我就可以调整 canvas 的大小,然后将所有内容计算为缩放后的大小?

Uno/WinUI Xaml 中的 WidthHeight 等布局值在 'logical pixels' 中定义,与 'physical pixels' 不同。由于具有相似物理尺寸的设备可能具有截然不同的物理像素密度,因此在大多数情况下逻辑像素是指定布局尺寸的更好方法。

确保您理解 Xaml 的 layouting system - 当您将内容拉伸到屏幕宽度时,通常根本不应该对尺寸进行硬编码。例如:

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

综上所述,在极少数情况下,您确实需要使用与设备相关的物理像素,您可以使用 DisplayInformation class 及其属性,例如:

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