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

标签 c# ios xamarin xamarin.forms

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

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

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

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

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 太小!

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

添加截图,第一个大,第二个小(引用屏幕尺寸)

Display.Width ( to big )

Display.XDpi ( to small )

最佳答案

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

但是,您正在使用的 Xamarin Forms Labs IDisplay 界面返回的宽度/高度值是物理像素,这就是一切看起来如此之大的原因。幸运的是,它似乎有一个 Scale 属性,当光栅进程想要合成最终的物理图像时,它是应用于虚拟分辨率的乘数。

因此,只需将 Display.WidthDisplay.Height 除以 Display.Scale 即可得到设备合成层的尺寸用于视口(viewport)大小 - 在您的情况下,它应该是 375 点/虚拟单位的宽度,因为 iPhone 6 比例乘数是 2。

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

关于c# - 在 Xamarin 表单中获取正确的设备宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33367521/

相关文章:

ios - 可变数组 iOS 中的最大元素

sqlite - 如何在 Xamarin Forms 的 SQLite 中保存图像?

c# - MVC 4 手机和平板 View 分离

c# - 在使用 Entity Fluent API 映射的 View 中使用 ROW_NUMBER 设置主键会使 linq 超时

c# - 如何在运行时在 IEnumerable<T> 上创建动态 Select?

c# - Students.Where(x=>x.City == "Lahore").ToList(); 之间的差异Students.ToList().Where(x=>x.City == "Lahore");

ios - Swift 图像 slider /轮播 UIPageViewController 与 Scroll View

ios - 使用协议(protocol)对类似的 UITableViewCell 进行分组以减少代码

java - 为什么我无法在标签页中添加 ImageView?

xamarin - 将委托(delegate)对象正确分配给 iOS Mobile Blazor 绑定(bind)的 UNUserNotificationCenter 对象