wake-up-neo.com

Wie kann ich die Bildschirmgröße in Xamarin.Forms ermitteln/ermitteln?

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?

17
dmc

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:

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 exakten Zoll für Zoll Rahmens auf allen Plattformen unabhängig von den 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 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)
4
SKall

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;

    ...
}
30
kaolick

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
5
Tushar patel

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>
  1. 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; }

  2. 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

1

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));
1
sof98789

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;
}

ref: Microsoft Docs

0
Duane