Xamarin.Forms Geräteklasse
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.iOS
Enumerationswerten , TargetPlatform.Android
, TargetPlatform.WinPhone
und 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
});