2014-06-28 4 views
16

Ich versuche eine App neu zu schreiben, die ich für iOS geschrieben habe. Ich wollte eine Android-Version schreiben, dachte aber, dass es besser wäre, dies zur Gelegenheit zu machen, Xamarin.Forms zu verwenden. Ich mache jetzt eine Seite nach der anderen, jetzt bin ich auf einer Seite fest, wo ich die Breite und Höhe des Bildschirms bekommen muss. Kennt jemand das Äquivalent von iOS 'View.Frame.Width in Xamarin.Forms? ErstellenWie erhalte ich Bildschirmgröße in Xamarin.Forms?

Antwort

4

Es ist nicht ein Weg von Xamarin.Forms selbst, aber wir haben es als PCL-kompatible Schnittstelle in Xamarin implementiert. Forms.Labs, die Sie von NuGet oder Quellcode von GitHub erhalten können.

https://github.com/XForms/Xamarin-Forms-Labs

IDevice hat IDisplay Eigenschaft mit der Information; Höhe, Breite, Pixeldichte für X & Y und Paar Verlängerungsmethoden zur Berechnung der Größe in Zoll.

Musterseite für Informationen aus dem Gerät bekommen:

https://github.com/XForms/Xamarin-Forms-Labs/blob/master/samples/Xamarin.Forms.Labs.Sample/Pages/Services/ExtendedDeviceInfoPage.cs

 #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 genauen Zoll-by-Zoll-Rahmen auf allen Plattformen unabhängig von Anzeigeeigenschaften:

https://github.com/XForms/Xamarin-Forms-Labs/blob/master/samples/Xamarin.Forms.Labs.Sample/Pages/Services/AbsoluteLayoutWithDisplayInfoPage.cs

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 ge t Um die Geräteinfo einzustellen, stellen Sie entweder Ihren DI-Resolver ein oder verwenden Sie einen statischen Container. Alle drei Plattformen haben ein Singleton Gerät ruft mit statischer CurrentDevice Eigenschaft:

resolverContainer.Register<IDevice>(t => WindowsPhoneDevice.CurrentDevice) 
resolverContainer.Register<IDevice>(t => AppleDevice.CurrentDevice) 
resolverContainer.Register<IDevice>(t => AndroidDevice.CurrentDevice) 
+0

Dank @SKall, ich mache nicht meine App PCL Weg - aber ich werde sicher schauen und sehen, ob ich ein paar Ideen bekommen kann. Vielen Dank! – dmc

+0

Der Code funktioniert natürlich, ob gemeinsamer Code oder PCL verwendet wird. Bei gemeinsam genutztem Code benötigen Sie keine DI, sondern verwenden Compiler-Flags, um das aktuelle Gerät zu erhalten. – SKall

+0

Vielen Dank @SKall, werde dies am Morgen ausprobieren. – dmc

1

Rezept

eine neue Xamarin.Android Anwendung namens Screen. bearbeiten Main.axml so dass es enthält zwei Textviews:

<?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> 
  1. bearbeiten Activity1.cs, den Code in OnCreate wie folgt ändern:

    [Bild Beschreibung hier eingeben] [1] private int ConvertPixelsToDp (GleitpixelValue) { var dp = (int) ((pixelValue) /Resources.DisplayMetrics.Density); Rückgabe dp; }

  2. Führen Sie die Anwendung aus. Je nach Gerät wird die Bildschirmhöhe und -breite angezeigt. Der folgende Screenshot ist von einem Galaxy Nexus:

[image link] http://i.stack.imgur.com/TQhba.png

+1

Ich war auf der Suche nach "Xamarin.Forms" Art und Weise, aber dank. – dmc

30

Es ist eine einfache Möglichkeit, den Bildschirm Breite und Höhe in Xamarin.Forms und greifen Sie weltweit von überall in der App zu bekommen. Ich würde so etwas tun:

1. Erstellen Sie zwei öffentliche Mitglieder in Ihrer App.cs:

public static class App 
{ 
    public static int ScreenWidth; 
    public static int ScreenHeight; 
    ... 
} 

2.Legen Sie die Werte in IhremMainActivity.cs(Android) oder IhreAppDelegate.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; 

    ... 
} 
+0

App.cs ist nicht statisch – Julien

+0

@Julien Vor Xamarin.Forms Version 1.3.x war es. Ein noch genauerer Weg ist in unserem Buch auf http://xforms-kickstarter.com/ unter ** Bezug zur Bildschirmgröße ** beschrieben. – kaolick

+0

Auf Android empfehle ich Verwendung: var pixels = Resources.DisplayMetrics.WidthPixels; // dip pixels var scale = Ressourcen.DisplayMetrics.Density; int dps = (int) ((Pixel - 0,5f)/Skalierung); App.ScreenWidth = dps; Pixel = Ressourcen.DisplayMetrics.HeightPixels; // Dip-Pixel dps = (int) ((Pixel - 0,5f)/Skala); App.ScreenHeight = dps; // dip pixels – Maury

0

In Ihrer App-Datei eine öffentliche definieren statische Variable

public static Size ScreenSize; 

Sie sollten die Variable sowohl in IOS als auch in Android initialisieren, bevor Sie den App-Konstruktor aufrufen. Für IOS, in FinishedLaunching Methode

App.ScreenSize = new Size(UIScreen.MainScreen.Bounds.Width, UIScreen.MainScreen.Bounds.Height); 

und für Android, in OnCreate Funktion

  App.ScreenSize = new Xamarin.Forms.Size((int)(Resources.DisplayMetrics.WidthPixels/Resources.DisplayMetrics.Density), (int)(Resources.DisplayMetrics.HeightPixels/Resources.DisplayMetrics.Density)); 
5

Wenn Sie Xamarin Formulare verwenden, dann können Sie Breite und Höhe des aktuellen Bildschirms in tragbarer Klassenbibliothek finden (pcl) Wie unten.

Für Breite Sie diese in pcl verwenden, denn diese

Application.Current.MainPage.Width 

Für die Höhe Sie dies in pcl tun können,

Application.Current.MainPage.Height 
+0

Ich bekomme die Laufzeitausnahme "Objektreferenz nicht auf eine Instanz eines Objekts gesetzt.". –

+1

Dies gibt Ihnen die Breite und Höhe, die Sie definieren. nicht die tatsächlichen Bildschirmgerätegrößen. Sie können in xaml width = 5000 hinzufügen und es wird 5000 zurückgeben. Sie müssen native gehen, um tatsächliche Bildschirmgrößen zu erhalten. – batmaci