以Xamarin形式获取正确的设备宽度

Dep*_*hie 3 c# ios xamarin xamarin.forms

在我的Xamarin Forms项目中使用Xamarin实验室,它有一个类,您可以使用它来请求有关应用程序所在的运行设备的信息.

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

所以在我的表单代码中,我通过请求Resolver.Resolve<IDevice>.Display.Width或获得宽度Resolver.Resolve<IDevice>.Display.XDpi

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

var image = new Image (){ Source = "img1.jpg", WidthRequest = _display.Width });
Run Code Online (Sandbox Code Playgroud)

我在里面展示它们 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>
Run Code Online (Sandbox Code Playgroud)

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

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

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

Display.Width(大)

Display.XDpi(小)

r2d*_*igo 5

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

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

所以,仅仅划分Display.WidthDisplay.Height通过Display.Scale,您将获得该设备的组成层使用视口大小的尺寸-在你的情况应该是由于iPhone 6的规模倍增的375点/虚拟单元的宽度为2.

如果您想了解有关iOS的虚拟分辨率如何与物理屏幕大小相对应的更多信息,您可以在此链接中找到非常详细的原理图.