Ich versuche, eine App, die ich für iOS geschrieben habe, neu zu schreiben. Ich wollte eine Android-Version schreiben, dachte aber, es wäre besser, Xamarin.Forms zu nutzen. Jetzt mache ich es Seite für Seite, jetzt stehe ich auf einer Seite, wo ich die Breite und Höhe des Bildschirms benötige. Kennt jemand das Äquivalent von iOS 'View.Frame.Width in Xamarin.Forms?
Momentan gibt es keinen Weg von Xamarin.Forms selbst, aber wir haben es als PCL-kompatible Schnittstelle in Xamarin.Forms.Labs implementiert, die Sie von NuGet oder Quellcode von GitHub erhalten können.
https://github.com/XForms/Xamarin-Forms-Labs
IDevice verfügt über eine IDisplay-Eigenschaft mit den Informationen. Höhe, Breite, Pixeldichte für X & Y und einige Erweiterungsmethoden zur Berechnung der Größe in Zoll.
Beispielseite zum Abrufen von Informationen vom Gerät:
#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
Erstellen eines exakten Zoll für Zoll Rahmens auf allen Plattformen unabhängig von den Anzeigeeigenschaften:
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;
}
}
Um zur Geräteinformation zu gelangen, stellen Sie entweder Ihren DI-Resolver ein oder verwenden Sie einen statischen Container. Alle 3 Plattformen verfügen über Einzelgeräteaufrufe mit statischer CurrentDevice-Eigenschaft:
resolverContainer.Register<IDevice>(t => WindowsPhoneDevice.CurrentDevice)
resolverContainer.Register<IDevice>(t => AppleDevice.CurrentDevice)
resolverContainer.Register<IDevice>(t => AndroidDevice.CurrentDevice)
Es gibt eine einfache Möglichkeit, die Breite und Höhe des Bildschirms in Xamarin.Forms
abzurufen und von überall in Ihrer App darauf zuzugreifen. Ich würde so etwas machen:
1. Erstellen Sie zwei öffentliche Mitglieder in Ihren App.cs:
public static class App
{
public static int ScreenWidth;
public static int ScreenHeight;
...
}
2. Legen Sie die Werte in IhremMainActivity.cs
(Android) oder IhremAppDelegate.cs
(iOS):
Android:
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;
...
}
Wenn Sie Xamarin-Formulare verwenden, können Sie die Breite und Höhe des aktuellen Bildschirms in der Portable Class Library (pcl) wie folgt ermitteln.
Für Width verwenden Sie dies in pcl,
Application.Current.MainPage.Width
Für die Höhe können Sie dies in pcl tun,
Application.Current.MainPage.Height
Rezept
Erstellen Sie eine neue Xamarin.Android-Anwendung mit dem Namen ScreenSize . Bearbeiten Sie Main.axml so, dass sie zwei TextViews enthält:
<?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>
Bearbeiten Sie Activity1.cs, ändern Sie den Code in OnCreate wie folgt:
! [Bildbeschreibung hier eingeben] [1] private int ConvertPixelsToDp (float pixelValue) { var dp = (int) ((pixelValue) /Resources.DisplayMetrics.Density); return dp; }
Führen Sie die Anwendung aus. Je nach Gerät werden Bildschirmhöhe und -breite angezeigt. Der folgende Screenshot ist von einem Galaxy Nexus:
[Bildlink] http://i.stack.imgur.com/TQhba.png
Definieren Sie in Ihrer App-Datei eine öffentliche statische Variable
public static Size ScreenSize;
Sie sollten die Variable sowohl in IOS als auch in Android initialisieren, bevor Sie den App Constructer aufrufen. Für IOS in der FinishedLaunching-Methode
App.ScreenSize = new Size(UIScreen.MainScreen.Bounds.Width, UIScreen.MainScreen.Bounds.Height);
und für Android in der OnCreate-Funktion
App.ScreenSize = new Xamarin.Forms.Size((int)(Resources.DisplayMetrics.WidthPixels / Resources.DisplayMetrics.Density), (int)(Resources.DisplayMetrics.HeightPixels / Resources.DisplayMetrics.Density));
Aktualisierung für zukünftige Entwickler, die versuchen, dies zu tun, das entweder nicht aussah oder versäumt hat. Die Page-Klasse erbt von VisualElement, das jetzt über zwei Eigenschaften verfügt (die für die Verwendung in XAML zufällig bindbar sind):
Width - Ruft die aktuell gerenderte Breite dieses Elements ab. Dies ist eine schreibgeschützte, bindbare Eigenschaft . Height - Ruft die aktuelle gerenderte Höhe dieses Elements ab. Dies ist eine schreibgeschützte schreibgeschützte Eigenschaft.
in Ihrer Seite Codebehind würden Sie einfach so etwas tun:
var myWidth = this.Width;
var myHeight = this.Height;
wenn Sie wissen müssen, ob es sich ändert, verwenden Sie das SizeChanged-Ereignis:
public MyPage()
{
SizeChanged += OnSizeChanged;
}
private void OnSizeChanged(object sender, EventArgs e)
{
var myWidth = this.Width;
var myHeight = this.Height;
}