在 Xamarin 表单中获取正确的设备宽度

Get correct device width in Xamarin forms

我正在使用 Xamarin labs in my Xamarin Forms 项目,它有一个 class,您可以使用它来请求有关应用所在的 运行 设备的信息。

就我而言,我想知道设备屏幕的当前宽度。 为此,您需要在 iOS appdelegate 中连接 IDisplay 接口,以便您可以在表单代码中使用它。

所以在我的表单代码中,我通过请求 Resolver.Resolve<IDevice>.Display.WidthResolver.Resolve<IDevice>.Display.XDpi

来获取宽度

现在,当 运行 在 iPhone 6 模拟器上运行时,我的宽度为 750,XDpi 为 326。 我现在要做的是使用这两个值之一来调整屏幕上图像的大小,以便它们具有屏幕的确切宽度。

var image = new Image (){ Source = "img1.jpg", WidthRequest = _display.Width });

我在 ExtendedScrollView

中展示它们
<StackLayout>
    <controlsXLabs:ExtendedScrollView x:Name="ImageScrollView"
                                      Orientation="Horizontal"
                                      AnimateScroll="true"
                                      Scrolled="OnScrolled">
        <StackLayout x:Name="DiscoverImagesStackLayout" Orientation="Horizontal" />
    </controlsXLabs:ExtendedScrollView>
    <Button Text="Click me" Clicked="OnButtonClicked" />
</StackLayout>

但我现在面临的问题是使用宽度 (750) 太大(视网膜缩放?)而使用 XDpi 太小!

换句话说,如何获得可用于匹配图像宽度的实际屏幕宽度? 还是我做错了什么?

添加了屏幕截图,第一个大,第二个小(参考屏幕尺寸)

看起来 Xamarin Forms XAML 布局使用 iOS 的点进行测量 - 即虚拟分辨率,然后按比例放大以匹配设备的物理像素。

但是,您使用的 Xamarin Forms Labs IDisplay 界面 returns width/height 值是物理像素,这就是为什么一切看起来都这么大的原因。幸运的是,它似乎有一个 Scale 属性,这是当光栅过程想要合成最终的物理图像时应用于虚拟分辨率的乘数。

因此,只需将 Display.WidthDisplay.Height 除以 Display.Scale,您将获得设备的合成层用于视口大小的尺寸 - 在您的情况下应该是宽度为 375 points/virtual 个单位,因为 iPhone 6 比例乘数是 2.

如果您想了解有关 iOS 的虚拟分辨率如何与物理屏幕尺寸对应的更多信息,您可以在 this link 中找到非常详细的原理图。