Xamarin.Forms Geräteklasse

Download Sample Das Beispiel herunterladen

Die Device Klasse enthält eine Reihe von Eigenschaften und Methoden, um Entwicklern dabei zu helfen, Layout und Funktionalität auf Plattformbasis anzupassen.

Zusätzlich zu Methoden und Eigenschaften zum Zielcode auf bestimmten Hardwaretypen und Größen enthält die Device Klasse Methoden, mit denen Benutzeroberflächensteuerelemente aus Hintergrundthreads interagieren können. Weitere Informationen finden Sie unter "Interagieren mit der Benutzeroberfläche aus Hintergrundthreads".

Bereitstellen plattformspezifischer Werte

Xamarin.Forms Vor 2.3.4 konnte die Anwendung, auf der die Anwendung ausgeführt wird, abgerufen werden, indem sie die Device.OS Eigenschaft untersucht und mit den Werten der Aufzählung, der Aufzählung und TargetPlatform.Windows deren TargetPlatform.iOSTargetPlatform.AndroidTargetPlatform.WinPhoneWerte verglichen wird. Ebenso könnte eine der Device.OnPlatform Überladungen verwendet werden, um plattformspezifische Werte für ein Steuerelement bereitzustellen.

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

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

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 und On Klassen 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 Trennzeichenwerte string akzeptieren.

Wichtig

Das Bereitstellen eines falschen Platform Attributwerts in der On Klasse führt nicht zu einem Fehler. Stattdessen wird der Code ohne den plattformspezifischen Wert ausgeführt, der angewendet wird.

Alternativ kann die Markuperweiterung in XAML verwendet werden, um die OnPlatform Ui-Darstellung 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 von dem 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 breiter als 600 Dips^
  • Desktop – nur in UWP-Apps auf Windows 10 Desktopcomputern zurückgegeben (gibt Phone auf mobilen Windows Geräten zurück, einschließlich in Continuum-Szenarien)
  • TV – Tizen TV-Geräte
  • Watch – Tizen-Überwachungsgerä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 OnIdiom Markuperweiterung in XAML verwendet werden, um die Ui-Darstellung 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 Wert mithilfe der Device.FlowDirectionx: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 " Rechts-nach-links-Lokalisierung".

Device.Styles

Die Styles Eigenschaft enthält integrierte Stildefinitionen, die auf einige Steuerelemente (z Label. B. ) Style -Eigenschaft angewendet werden können. Die verfügbaren Formatvorlagen sind:

  • BodyStyle
  • CaptionStyle
  • ListItemDetailTextStyle
  • ListItemTextStyle
  • UntertitelStyle
  • 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 unterstützung für benannte Farben ein. Eine benannte Farbe ist eine Farbe, die je nach Systemmodus (z. B. Hell oder Dunkel) auf dem Gerät aktiv ist. Auf Android werden benannte Farben über die R.Color-Klasse zugegriffen. Bei iOS werden benannte Farben als Systemfarben bezeichnet. Auf dem 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 verwendet ein Argument und gibt ein stringColor:

// 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 spezifisch für eine Plattform zurückgibt, 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 von zeitabhängigen Aufgaben bietet, die im Xamarin.Forms allgemeinen Code funktionieren, einschließlich einer .NET Standardbibliothek. Übergeben Sie ein TimeSpan , um das Intervall festzulegen und true zurückzugeben, um den Zeitgeber nach dem aktuellen Aufruf auszuführen oder false 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 Zeitgebers mit der Benutzeroberfläche interagiert (z. B. den Text eines Label oder anzeigen einer Warnung festlegen), sollte es innerhalb BeginInvokeOnMainThread eines Ausdrucks erfolgen (siehe unten).

Hinweis

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

Interagieren mit der Benutzeroberfläche aus Hintergrundthreads

Die meisten Betriebssysteme, einschließlich iOS, Android und Universelle Windows-Plattform, verwenden ein einzelnes Threadingmodell für Code mit der Benutzeroberfläche. Dieser Thread wird häufig als Hauptthread oder ui-Thread bezeichnet. Eine Folge dieses Modells ist, dass der gesamte Code, der auf Benutzeroberflächenelemente zugreift, auf dem Hauptthread der Anwendung ausgeführt werden muss.

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

Die Device Klasse enthält die folgenden static Methoden, die verwendet werden können, um mit Benutzeroberflächenelementen aus Hintergrundthreads zu interagieren:

Methode Argumente Rückgabe Zweck
BeginInvokeOnMainThread Action void Ruft ein Action Hauptthread auf, und wartet nicht darauf, dass 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
});