Xamarin.Forms Geräteklasse
Die Device
Klasse enthält eine Reihe von Eigenschaften und Methoden, mit denen Entwickler Layout und Funktionalität auf Plattformbasis anpassen können.
Zusätzlich zu Methoden und Eigenschaften für den Zielcode für bestimmte Hardwaretypen und -größen enthält die Device
Klasse Methoden, die für die Interaktion mit UI-Steuerelementen aus Hintergrundthreads verwendet werden 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 Plattform, auf der die Anwendung ausgeführt wurde, durch Prüfung der Device.OS
Eigenschaft und Vergleich mit den TargetPlatform.iOS
Werten , TargetPlatform.Android
, TargetPlatform.WinPhone
und TargetPlatform.Windows
Enumerationswerten abgerufen werden. Ebenso könnte eine der Device.OnPlatform
Überladungen verwendet werden, um plattformspezifische Werte für ein Steuerelement bereitzustellen.
Seit Xamarin.Forms 2.3.4 werden diese APIs jedoch veraltet und ersetzt. Die Device
Klasse enthält nun ö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 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
klassen 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 Klasse On
kann das Attribut Platform
einen einzelnen string
-Wert oder mehrere durch Komma getrennte string
-Werte annehmen.
Wichtig
Das Bereitstellen 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 OnPlatform
Markuperweiterung in XAML verwendet werden, um die 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 breiter als 600 Dips^
- Desktop – wird 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-Uhrengeräte
- Nicht unterstützt – nicht verwendet
^ Dips ist nicht notwendigerweise die physische Pixelanzahl
Die Idiom
Eigenschaft ist besonders hilfreich beim Erstellen von Layouts, die größere Bildschirme nutzen, z. B.:
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 der Seite vom Auge wahrgenommen werden. Diese Enumerationswerte lauten:
In XAML kann der Wert mithilfe der Device.FlowDirection
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 Formatdefinitionen, die auf einige Steuerelemente (z Label
. B. ) Style
angewendet werden können. Die verfügbaren Formatvorlagen sind:
- BodyStyle
- CaptionStyle
- ListItemDetailTextStyle
- ListItemTextStyle
- SubtitleStyle
- TitleStyle
Device.GetNamedSize
GetNamedSize
kann beim Festlegen FontSize
im 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 bietet Unterstützung für benannte Farben. 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. Auf Android wird über die R.Color-Klasse auf benannte Farben zugegriffen. Unter iOS werden benannte Farben als Systemfarben bezeichnet. Im 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 string
Argument und gibt folgendes Color
zurück:
// 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
er auf einer nicht unterstützten Plattform aufgerufen wird.
Hinweis
Da die GetNamedColor
Methode eine Color
für eine Plattform spezifische Methode 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 zeitabhängiger Aufgaben bietet, die in Xamarin.Forms gemeinsamem 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 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 Timers mit der Benutzeroberfläche interagiert (z. B. festlegen des Texts eines Label
oder anzeigen einer Warnung), sollte er innerhalb eines BeginInvokeOnMainThread
Ausdrucks erfolgen (siehe unten).
Hinweis
Bei System.Timers.Timer
den Klassen handelt System.Threading.Timer
es sich um .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 Einzelthreadingmodell für Code, der die Benutzeroberfläche umfasst. Dieser Thread wird häufig als Hauptthread oder UI-Thread bezeichnet. Ein Ergebnis dieses Modells ist, dass der gesamte Code, der auf Benutzeroberflächenelemente zugreift, im 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 in 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 für die Interaktion mit Benutzeroberflächenelementen aus Hintergrundthreads verwendet werden können:
Methode | Argumente | Rückgabe | Zweck |
---|---|---|---|
BeginInvokeOnMainThread |
Action |
void |
Ruft einen Action im Hauptthread auf und wartet nicht, bis er 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
});