Xamarin.Forms Geräteklasse

Beispiel herunterladen Das Beispiel herunterladen

Die Device -Klasse enthält eine Reihe von Eigenschaften und Methoden, die Entwicklern beim Anpassen von Layout und Funktionalität auf Plattformbasis helfen.

Zusätzlich zu Methoden und Eigenschaften für den Zielcode für bestimmte Hardwaretypen und -größen enthält die -Klasse Methoden, die Device für die Interaktion mit UI-Steuerelementen aus Hintergrundthreads verwendet werden können. Weitere Informationen finden Sie unter Interagieren mit der Benutzeroberfläche über Hintergrundthreads.

Bereitstellen plattformspezifischer Werte

Xamarin.Forms Vor Version 2.3.4 konnte die Plattform, auf der die Anwendung ausgeführt wurde, abgerufen werden, indem die Device.OS Eigenschaft untersucht und mit den TargetPlatform.iOSEnumerationswerten , TargetPlatform.Android, TargetPlatform.WinPhoneund TargetPlatform.Windows verglichen wurde. Ebenso könnte eine der Device.OnPlatform Überladungen verwendet werden, um plattformspezifische Werte für ein Steuerelement bereitzustellen.

Seit Xamarin.Forms Version 2.3.4 sind diese APIs jedoch veraltet und ersetzt. Die Device -Klasse enthält jetzt öffentliche Zeichenfolgenkonstanten, die Plattformen identifizieren – Device.iOS, Device.Android, Device.WinPhone(veraltet), Device.WinRT (veraltet), Device.UWP, und Device.macOS. Ebenso wurden die Device.OnPlatform Überladungen durch die OnPlatform APIs und On ersetzt.

In C# können plattformspezifische Werte bereitgestellt werden, indem eine switch -Anweisung für die Device.RuntimePlatform -Eigenschaft erstellt und dann Anweisungen für die erforderlichen Plattformen bereitgestellt case werden:

double top;
switch (Device.RuntimePlatform)
{
  case Device.iOS:
    top = 20;
    break;
  case Device.Android:
  case Device.UWP:
  default:
    top = 0;
    break;
}
layout.Margin = new Thickness(5, top, 5, 0);

Die OnPlatform Klassen und On bieten die gleiche Funktionalität in XAML:

<StackLayout>
  <StackLayout.Margin>
    <OnPlatform x:TypeArguments="Thickness">
      <On Platform="iOS" Value="0,20,0,0" />
      <On Platform="Android, UWP" Value="0,0,0,0" />
    </OnPlatform>
  </StackLayout.Margin>
  ...
</StackLayout>

Die OnPlatform -Klasse ist eine generische Klasse, die mit einem x:TypeArguments Attribut instanziiert werden muss, das dem Zieltyp entspricht. In der On -Klasse kann das Platform Attribut einen einzelnen string Wert oder mehrere durch Trennzeichen getrennte string Werte akzeptieren.

Wichtig

Die Angabe eines falschen Platform Attributwerts in der On Klasse führt nicht zu einem Fehler. Stattdessen wird der Code ausgeführt, ohne dass der plattformspezifische Wert angewendet wird.

Alternativ kann die Markuperweiterung in XAML verwendet werden, um die OnPlatform Darstellung der Benutzeroberfläche pro Plattform anzupassen. Weitere Informationen finden Sie unter OnPlatform-Markuperweiterung.

Device.Idiom

Die Device.Idiom -Eigenschaft kann verwendet werden, um Layouts oder Funktionen abhängig vom Gerät zu ändern, auf dem die Anwendung ausgeführt wird. Die TargetIdiom-Enumeration verfügt über folgende Werte:

  • Telefon – iPhone, iPod Touch und Android-Geräte schmaler als 600 Dips^
  • Tablet – iPad, Windows-Geräte und Android-Geräte größer als 600 Dips^
  • Desktop – wird nur in UWP-Apps auf Windows 10 Desktopcomputern zurückgegeben (Rückgaben Phone auf mobilen Windows-Geräten, einschließlich in Continuum-Szenarien)
  • TV – Tizen TV-Geräte
  • Ansehen – Tizen-watch-Geräte
  • Nicht unterstützt – nicht verwendet

^ Dips ist nicht unbedingt die physische Pixelanzahl.

Die Idiom Eigenschaft ist besonders nützlich für das Erstellen von Layouts, die größere Bildschirme nutzen, wie folgt:

if (Device.Idiom == TargetIdiom.Phone) {
    // layout views vertically
} else {
    // layout views horizontally for a larger display (tablet or desktop)
}

Die OnIdiom -Klasse bietet die gleiche Funktionalität in XAML:

<StackLayout>
    <StackLayout.Margin>
        <OnIdiom x:TypeArguments="Thickness">
            <OnIdiom.Phone>0,20,0,0</OnIdiom.Phone>
            <OnIdiom.Tablet>0,40,0,0</OnIdiom.Tablet>
            <OnIdiom.Desktop>0,60,0,0</OnIdiom.Desktop>
        </OnIdiom>
    </StackLayout.Margin>
    ...
</StackLayout>

Die OnIdiom -Klasse ist eine generische Klasse, die mit einem x:TypeArguments Attribut instanziiert werden muss, das dem Zieltyp entspricht.

Alternativ kann die Markuperweiterung in XAML verwendet werden, um die OnIdiom Darstellung der Benutzeroberfläche basierend auf dem Idiom des Geräts anzupassen, auf dem die Anwendung ausgeführt wird. Weitere Informationen finden Sie unter OnIdiom-Markuperweiterung.

Device.FlowDirection

Der Device.FlowDirection -Wert ruft einen FlowDirection Enumerationswert ab, der die aktuelle Flussrichtung darstellt, die vom Gerät verwendet wird. Die Leserichtung ist die Richtung, in der Benutzeroberflächenelemente auf einer Seite vom Auge wahrgenommen werden. Diese Enumerationswerte lauten:

In XAML kann der Device.FlowDirection Wert mithilfe der x:Static Markuperweiterung abgerufen werden:

<ContentPage ... FlowDirection="{x:Static Device.FlowDirection}"> />

Der entsprechende Code in C# lautet:

this.FlowDirection = Device.FlowDirection;

Weitere Informationen zur Flussrichtung finden Sie unter Lokalisierung von rechts nach links.

Device.Styles

Die Styles -Eigenschaft enthält integrierte Stildefinitionen, die auf die Eigenschaft einiger Steuerelemente (z Label. B. ) Style angewendet werden können. Folgende Stile stehen zur Verfügung:

  • BodyStyle
  • CaptionStyle
  • ListItemDetailTextStyle
  • ListItemTextStyle
  • SubtitleStyle
  • Titlestyle

Device.GetNamedSize

GetNamedSize kann beim Festlegen FontSize in C#-Code verwendet werden:

myLabel.FontSize = Device.GetNamedSize (NamedSize.Small, myLabel);
someLabel.FontSize = Device.OnPlatform (
      24,         // hardcoded size
      Device.GetNamedSize (NamedSize.Medium, someLabel),
      Device.GetNamedSize (NamedSize.Large, someLabel)
);

Device.GetNamedColor

Xamarin.Forms 4.6 führt die Unterstützung für benannte Farben ein. Eine benannte Farbe ist eine Farbe, die einen anderen Wert aufweist, je nachdem, welcher Systemmodus (z. B. hell oder dunkel) auf dem Gerät aktiv ist. Unter Android wird über die R.Color-Klasse auf benannte Farben zugegriffen. Unter iOS werden benannte Farben als Systemfarben bezeichnet. Auf der Universelle Windows-Plattform werden benannte Farben als XAML-Designressourcen bezeichnet.

Die GetNamedColor -Methode kann verwendet werden, um benannte Farben unter Android, iOS und UWP abzurufen. Die -Methode akzeptiert ein string -Argument und gibt einen zurück Color:

// Retrieve an Android named color
Color color = Device.GetNamedColor(NamedPlatformColor.HoloBlueBright);

Color.Default wird zurückgegeben, wenn ein Farbname nicht gefunden werden kann oder wenn GetNamedColor auf einer nicht unterstützten Plattform aufgerufen wird.

Hinweis

Da die GetNamedColor -Methode eine Color zurückgibt, die plattformspezifisch ist, sollte sie in der Regel in Verbindung mit der Device.RuntimePlatform -Eigenschaft verwendet werden.

Die NamedPlatformColor -Klasse enthält die Konstanten, die die benannten Farben für Android, iOS und UWP definieren:

Android iOS macOS UWP
BackgroundDark Label AlternateSelectedControlTextColor SystemAltHighColor
BackgroundLight Link ControlAccent SystemAltLowColor
Black OpaqueSeparator ControlBackgroundColor SystemAltMediumColor
DarkerGray PlaceholderText ControlColor SystemAltMediumHighColor
HoloBlueBright QuaternaryLabel DisabledControlTextColor SystemAltMediumLowColor
HoloBlueDark SecondaryLabel FindHighlightColor SystemBaseHighColor
HoloBlueLight Separator GridColor SystemBaseLowColor
HoloGreenDark SystemBlue HeaderTextColor SystemBaseMediumColor
HoloGreenLight SystemGray HighlightColor SystemBaseMediumHighColor
HoloOrangeDark SystemGray2 KeyboardFocusIndicatorColor SystemBaseMediumLowColor
HoloOrangeLight SystemGray3 Label SystemChromeAltLowColor
HoloPurple SystemGray4 LabelColor SystemChromeBlackHighColor
HoloRedDark SystemGray5 Link SystemChromeBlackLowColor
HoloRedLight SystemGray6 LinkColor SystemChromeBlackMediumColor
TabIndicatorText SystemGreen PlaceholderText SystemChromeBlackMediumLowColor
Transparent SystemIndigo PlaceholderTextColor SystemChromeDisabledHighColor
White SystemOrange QuaternaryLabel SystemChromeDisabledLowColor
WidgetEditTextDark SystemPink QuaternaryLabelColor SystemChromeHighColor
SystemPurple SecondaryLabel SystemChromeLowColor
SystemRed SecondaryLabelColor SystemChromeMediumColor
SystemTeal SelectedContentBackgroundColor SystemChromeMediumLowColor
SystemYellow SelectedControlColor SystemChromeWhiteColor
TertiaryLabel SelectedControlTextColor SystemListLowColor
SelectedMenuItemTextColor SystemListMediumColor
SelectedTextBackgroundColor
SelectedTextColor
Separator
SeparatorColor
ShadowColor
SystemBlue
SystemGray
SystemGreen
SystemIndigo
SystemOrange
SystemPink
SystemPurple
SystemRed
SystemTeal
SystemYellow
TertiaryLabel
TertiaryLabelColor
TextBackgroundColor
TextColor
UnderPageBackgroundColor
UnemphasizedSelectedContentBackgroundColor
UnemphasizedSelectedTextBackgroundColor
UnemphasizedSelectedTextColor
WindowBackgroundColor
WindowFrameTextColor

Device.StartTimer

Die Device -Klasse verfügt auch über eine StartTimer -Methode, die eine einfache Möglichkeit zum Auslösen zeitabhängiger Aufgaben bietet, die in Xamarin.Forms allgemeinem Code funktionieren, einschließlich einer .NET Standard-Bibliothek. Übergeben Sie ein TimeSpan , um das Intervall festzulegen, und kehren Sie zurück true , um den Timer aktiv zu halten oder false ihn nach dem aktuellen Aufruf zu beenden.

Device.StartTimer (new TimeSpan (0, 0, 60), () =>
{
    // do something every 60 seconds
    return true; // runs again, or false to stop
});

Wenn der Code innerhalb des Timers mit der Benutzeroberfläche interagiert (z. B. das Festlegen des Texts eines Label oder das Anzeigen einer Warnung), sollte dies innerhalb eines Ausdrucks BeginInvokeOnMainThread erfolgen (siehe unten).

Hinweis

Die System.Timers.Timer Klassen und System.Threading.Timer sind .NET Standard-Alternativen zur Verwendung der Device.StartTimer -Methode.

Interagieren mit der Benutzeroberfläche über Hintergrundthreads

Die meisten Betriebssysteme, einschließlich iOS, Android und der Universelle Windows-Plattform, verwenden ein Single-Threading-Modell für Code, der die Benutzeroberfläche umfasst. Dieser Thread wird häufig als Standard Thread oder UI-Thread bezeichnet. Eine Folge dieses Modells ist, dass der gesamte Code, der auf Benutzeroberflächenelemente zugreift, im Standard Thread der Anwendung ausgeführt werden muss.

Anwendungen verwenden manchmal Hintergrundthreads, um potenziell lang andauernde Vorgänge auszuführen, z. B. das Abrufen von Daten aus einem Webdienst. Wenn Code, der in einem Hintergrundthread ausgeführt wird, auf Benutzeroberflächenelemente zugreifen muss, muss dieser Code im Standard Thread ausgeführt werden.

Die Device -Klasse enthält die folgenden static Methoden, die für die Interaktion mit Benutzeroberflächenelementen aus Hintergrundthreads verwendet werden können:

Methode Argumente Rückgabe Zweck
BeginInvokeOnMainThread Action void Ruft eine Action für den Standard-Thread auf und wartet nicht, bis es abgeschlossen ist.
InvokeOnMainThreadAsync<T> Func<T> Task<T> Ruft Func<T> auf dem Hauptthread auf, und wartet auf den Abschluss
InvokeOnMainThreadAsync Action Task Ruft Action auf dem Hauptthread auf, und wartet auf den Abschluss
InvokeOnMainThreadAsync<T> Func<Task<T>> Task<T> Ruft Func<Task<T>> auf dem Hauptthread auf, und wartet auf den Abschluss
InvokeOnMainThreadAsync Func<Task> Task Ruft Func<Task> auf dem Hauptthread auf, und wartet auf den Abschluss
GetMainThreadSynchronizationContextAsync Task<SynchronizationContext> Gibt SynchronizationContext für den Hauptthread zurück

Der folgende Code zeigt ein Beispiel für die Verwendung der BeginInvokeOnMainThread -Methode:

Device.BeginInvokeOnMainThread (() =>
{
    // interact with UI elements
});