我正在尝试重写我为iOS编写的应用程序。我打算写一个Android版本,但认为最好让这个机会使用Xamarin.Forms。一次做一页,现在我被困在一个我需要获得屏幕宽度和高度的页面上。有没有人知道Xamarin.Forms中iOS'View.Frame.Width的等价物?
答案 0 :(得分:30)
更新:您可以使用Xamarin.Essentials nuget包进行此操作以及其他许多用途。
var width = DeviceDisplay.MainDisplayInfo.Width;
var height = DeviceDisplay.MainDisplayInfo.Height;
旧回答:
有一种简单的方法可以在Xamarin.Forms
中获取屏幕的宽度和高度,并从应用中的任何位置全局访问它。我会做这样的事情:
<强> 1。在App.cs中创建两个公共成员:
public static class App
{
public static int ScreenWidth;
public static int ScreenHeight;
...
}
<强> 2。设置 MainActivity.cs
(Android)或 AppDelegate.cs
(iOS)中的值:
机器人:
protected override void OnCreate(Bundle bundle)
{
...
App.ScreenWidth = (int)Resources.DisplayMetrics.WidthPixels; // real pixels
App.ScreenHeight = (int)Resources.DisplayMetrics.HeightPixels; // real pixels
// App.ScreenWidth = (int)(Resources.DisplayMetrics.WidthPixels / Resources.DisplayMetrics.Density); // device independent pixels
// App.ScreenHeight = (int)(Resources.DisplayMetrics.HeightPixels / Resources.DisplayMetrics.Density); // device independent pixels
...
}
的iOS:
public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
...
App.ScreenWidth = (int)UIScreen.MainScreen.Bounds.Width;
App.ScreenHeight = (int)UIScreen.MainScreen.Bounds.Height;
...
}
答案 1 :(得分:6)
如果您使用的是xamarin表格,那么您可以在便携式类库(pcl)中找到当前屏幕的宽度和高度,如下所示。
对于Width,您可以在pcl中使用它,
Application.Current.MainPage.Width
对于身高,您可以在pcl,
中执行此操作Application.Current.MainPage.Height
答案 2 :(得分:4)
目前还没有一种来自Xamarin.Forms本身的方法,但我们将它实现为Xamarin.Forms.Labs中的PCL兼容接口,您可以从NuGet获取或从GitHub获取源代码。
https://github.com/XForms/Xamarin-Forms-Labs
IDevice具有IDisplay属性及其信息; X&amp;的高度,宽度,像素密度Y和几个扩展方法以英寸计算大小。
从设备获取信息的示例页面:
#region Display information
var display = device.Display;
var displayFrame = new Frame();
if (display != null)
{
displayFrame.Content = new StackLayout()
{
Children =
{
new Label() { Text = display.ToString() },
new Label() { Text = string.Format("Screen width is\t {0:0.0} inches.", display.ScreenWidthInches()) },
new Label() { Text = string.Format("Screen height is\t {0:0.0} inches.", display.ScreenHeightInches()) },
new Label() { Text = string.Format("Screen diagonal size is\t {0:0.0} inches.", display.ScreenSizeInches()) }
}
};
}
else
{
displayFrame.Content = new Label() { TextColor = Color.Red, Text = "Device does not contain display information." };
}
stack.Children.Add(displayFrame);
#endregion
在所有平台上创建精确的逐英寸框架,无论显示属性如何:
public class AbsoluteLayoutWithDisplayInfoPage : ContentPage
{
public AbsoluteLayoutWithDisplayInfoPage(IDisplay display)
{
this.Title = "Absolute Layout With Display Info";
var abs = new AbsoluteLayout();
var inchX = display.WidthRequestInInches(1);
var inchY = display.HeightRequestInInches(1);
var originX = display.WidthRequestInInches(display.ScreenWidthInches() / 2);
var originY = display.HeightRequestInInches(display.ScreenHeightInches() / 2);
abs.Children.Add(new Label() { Text = "1\"x\"1\" blue frame" });
abs.Children.Add(new Frame()
{
BackgroundColor = Color.Navy,
},
new Rectangle(originX - inchX/2, originY - inchY/2, inchX, inchY));
abs.Children.Add(new Frame()
{
BackgroundColor = Color.White
},
new Rectangle(originX - inchX/16, originY - inchY/16, inchX/8, inchY/8));
this.Content = abs;
}
}
要获取设备信息,请设置DI解析器或使用静态容器。所有3个平台都具有带静态CurrentDevice属性的单例设备调用:
resolverContainer.Register<IDevice>(t => WindowsPhoneDevice.CurrentDevice)
resolverContainer.Register<IDevice>(t => AppleDevice.CurrentDevice)
resolverContainer.Register<IDevice>(t => AndroidDevice.CurrentDevice)
答案 3 :(得分:1)
配方
创建一个名为ScreenSize的新Xamarin.Android应用程序。 编辑Main.axml,使其包含两个TextView:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
android:text="Screen Width:"
android:textAppearance="?android:attr/textAppearanceLarge"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/screenWidthDp" />
<TextView
android:text="Screen Height:"
android:textAppearance="?android:attr/textAppearanceLarge"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/screenHeightDp" />
</LinearLayout>
编辑Activity1.cs,将OnCreate中的代码更改为以下内容:
![在此处输入图片说明] [1] private int ConvertPixelsToDp(float pixelValue) { var dp =(int)((pixelValue)/Resources.DisplayMetrics.Density); 返回dp; }
运行该应用程序。根据设备的不同,它将显示屏幕高度和宽度。以下屏幕截图来自Galaxy Nexus:
答案 4 :(得分:1)
在App文件中定义一个公共静态变量
public static Size ScreenSize;
在调用App constructer之前,您应该在IOS和Android中初始化变量。对于IOS,在FinishedLaunching方法
App.ScreenSize = new Size(UIScreen.MainScreen.Bounds.Width, UIScreen.MainScreen.Bounds.Height);
和Android,在OnCreate函数
App.ScreenSize = new Xamarin.Forms.Size((int)(Resources.DisplayMetrics.WidthPixels / Resources.DisplayMetrics.Density), (int)(Resources.DisplayMetrics.HeightPixels / Resources.DisplayMetrics.Density));
答案 5 :(得分:0)
更新未来的开发人员试图做到这一点,或者看不到或错过它。 Page类继承自VisualElement,它现在有两个属性(碰巧可绑定在XAML中使用):
宽度 - 获取此元素的当前渲染宽度。这是一个只读的可绑定属性。 高度 - 获取此元素的当前渲染高度。这是一个只读的可绑定属性。
在您的网页代码隐藏中,您只需执行以下操作:
var myWidth = this.Width;
var myHeight = this.Height;
如果您需要知道它是否发生变化,请使用SizeChanged事件:
public MyPage()
{
SizeChanged += OnSizeChanged;
}
private void OnSizeChanged(object sender, EventArgs e)
{
var myWidth = this.Width;
var myHeight = this.Height;
}