Xamarin.Forms Klasa urządzenia
Klasa Device
zawiera wiele właściwości i metod, które ułatwiają deweloperom dostosowywanie układu i funkcjonalności dla poszczególnych platform.
Oprócz metod i właściwości kodu docelowego w określonych typach sprzętu i rozmiarach klasa zawiera metody, Device
które mogą służyć do interakcji z kontrolkami interfejsu użytkownika z wątków w tle. Aby uzyskać więcej informacji, zobacz Interakcja z interfejsem użytkownika z wątków w tle.
Podaj wartości specyficzne dla platformy
Xamarin.Forms Przed wersją 2.3.4 platforma, na którą uruchomiono aplikację, można uzyskać, sprawdzając Device.OS
właściwość i porównując ją z wartościami TargetPlatform.iOS
TargetPlatform.Android
, , TargetPlatform.WinPhone
i TargetPlatform.Windows
wyliczenia. Podobnie można użyć jednego z Device.OnPlatform
przeciążeń w celu zapewnienia wartości specyficznych dla platformy dla kontrolki.
Jednak od Xamarin.Forms wersji 2.3.4 te interfejsy API zostały wycofane i zastąpione. Klasa Device
zawiera teraz stałe ciągów publicznych identyfikujące platformy — Device.iOS
, , Device.Android
(Device.WinPhone
przestarzałe), (przestarzałe), Device.UWP
Device.WinRT
i Device.macOS
. Device.OnPlatform
Podobnie przeciążenia zostały zastąpione interfejsami OnPlatform
API i On
.
W języku C#wartości specyficzne dla platformy można podać, tworząc instrukcję switch
we Device.RuntimePlatform
właściwości, a następnie podając case
instrukcje dla wymaganych platform:
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);
Klasy OnPlatform
i On
zapewniają te same funkcje w języku 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>
Klasa OnPlatform
jest klasą ogólną, która musi zostać utworzone za pomocą atrybutu zgodnego z typem x:TypeArguments
docelowym. On
W klasie Platform
atrybut może akceptować pojedynczą string
wartość lub wiele wartości rozdzielonych string
przecinkami.
Ważne
Podanie nieprawidłowej Platform
wartości atrybutu On
w klasie nie spowoduje błędu. Zamiast tego kod zostanie wykonany bez zastosowania wartości specyficznej dla platformy.
Alternatywnie OnPlatform
rozszerzenie znaczników może służyć w języku XAML do dostosowywania wyglądu interfejsu użytkownika dla poszczególnych platform. Aby uzyskać więcej informacji, zobacz OnPlatform Markup Extension (Rozszerzenie znaczników OnPlatform).
Device.Idiom
Właściwość Device.Idiom
może służyć do zmiany układów lub funkcji w zależności od urządzenia, na którym działa aplikacja. Wyliczenie TargetIdiom
zawiera następujące wartości:
- Telefon — urządzenia iPhone, iPod touch i Android węższe niż 600 dips^
- Tablet — urządzenia iPad, urządzenia z systemem Windows i urządzenia z systemem Android szersze niż 600 dips^
- Desktop — zwracane tylko w aplikacjach platformy UNIWERSALNEJ systemu Windows na komputerach stacjonarnych z systemem Windows 10 (zwracane
Phone
na urządzeniach przenośnych z systemem Windows, w tym w scenariuszach Continuum) - TV – urządzenia telewizyjne Tizen
- Zegarek — urządzenia zegarków Tizen
- Nieobsługiwane — nieużywane
^ dips nie musi być fizyczna liczba pikseli
Właściwość jest szczególnie przydatna Idiom
w przypadku tworzenia układów korzystających z większych ekranów, takich jak:
if (Device.Idiom == TargetIdiom.Phone) {
// layout views vertically
} else {
// layout views horizontally for a larger display (tablet or desktop)
}
Klasa OnIdiom
zapewnia te same funkcje w języku 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>
Klasa OnIdiom
jest klasą ogólną, która musi zostać utworzone za pomocą atrybutu zgodnego z typem x:TypeArguments
docelowym.
Alternatywnie można użyć rozszerzenia znaczników w języku XAML, OnIdiom
aby dostosować wygląd interfejsu użytkownika na podstawie idiomu urządzenia, na którym działa aplikacja. Aby uzyskać więcej informacji, zobacz OnIdiom Markup Extension (Rozszerzenie znaczników OnIdiom).
Device.FlowDirection
Wartość Device.FlowDirection
pobiera FlowDirection
wartość wyliczenia reprezentującą bieżący kierunek przepływu używany przez urządzenie. Kierunek przepływu to kierunek, w którym elementy interfejsu użytkownika na stronie są skanowane przez oko. Wartości wyliczenia to:
W języku Device.FlowDirection
XAML wartość można pobrać przy użyciu x:Static
rozszerzenia znaczników:
<ContentPage ... FlowDirection="{x:Static Device.FlowDirection}"> />
Równoważny kod w języku C# to:
this.FlowDirection = Device.FlowDirection;
Aby uzyskać więcej informacji na temat kierunku przepływu, zobacz Lokalizacja od prawej do lewej.
Device.Styles
Właściwość Styles
zawiera wbudowane definicje stylów, które można zastosować do niektórych kontrolek (takich jak Label
) Style
właściwości. Dostępne style to:
- Styl ciała
- CaptionStyle
- ListItemDetailTextStyle
- ListItemTextStyle
- Styl podtytułu
- Styl tytułu
Device.GetNamedSize
GetNamedSize
można użyć podczas ustawiania FontSize
w kodzie języka C#:
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 wprowadza obsługę nazwanych kolorów. Nazwany kolor to kolor, który ma inną wartość w zależności od tego, który tryb systemowy (na przykład jasny lub ciemny) jest aktywny na urządzeniu. W systemie Android dostęp do nazwanych kolorów uzyskuje się za pośrednictwem klasy R.Color . W systemie iOS nazwane kolory są nazywane kolorami systemu. Na platforma uniwersalna systemu Windows nazwane kolory są nazywane zasobami motywu XAML.
Metoda może służyć do pobierania GetNamedColor
nazwanych kolorów w systemach Android, iOS i UWP. Metoda przyjmuje string
argument i zwraca wartość Color
:
// Retrieve an Android named color
Color color = Device.GetNamedColor(NamedPlatformColor.HoloBlueBright);
Color.Default
zostanie zwrócona, gdy nie można odnaleźć nazwy koloru lub gdy GetNamedColor
jest wywoływana na nieobsługiwanej platformie.
Uwaga
GetNamedColor
Ponieważ metoda zwraca wartość specyficzną Color
dla platformy, zwykle powinna być używana w połączeniu z właściwością Device.RuntimePlatform
.
Klasa NamedPlatformColor
zawiera stałe, które definiują nazwane kolory dla systemów Android, iOS i UWP:
Android | iOS | macOS | Platforma 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
Klasa Device
ma również metodę StartTimer
, która zapewnia prosty sposób wyzwalania zadań zależnych od czasu, które działają we wspólnym kodzie, w Xamarin.Forms tym biblioteki .NET Standard. Przekaż element , TimeSpan
aby ustawić interwał i wrócić true
, aby zachować czasomierz uruchomiony lub false
zatrzymać go po bieżącej wywołaniu.
Device.StartTimer (new TimeSpan (0, 0, 60), () =>
{
// do something every 60 seconds
return true; // runs again, or false to stop
});
Jeśli kod wewnątrz czasomierza wchodzi w interakcję z interfejsem użytkownika (np. ustawieniem tekstu Label
obiektu lub wyświetleniem alertu), należy go wykonać wewnątrz BeginInvokeOnMainThread
wyrażenia (patrz poniżej).
Uwaga
Klasy System.Timers.Timer
i System.Threading.Timer
to alternatywy dla platformy .NET Standard przy użyciu Device.StartTimer
metody .
Interakcja z interfejsem użytkownika z wątków w tle
Większość systemów operacyjnych, w tym systemów iOS, Android i platforma uniwersalna systemu Windows, używa modelu jednowątkowego dla kodu obejmującego interfejs użytkownika. Ten wątek jest często nazywany głównym wątkiem lub wątkiem interfejsu użytkownika. Konsekwencją tego modelu jest to, że cały kod, który uzyskuje dostęp do elementów interfejsu użytkownika, musi być uruchamiany w głównym wątku aplikacji.
Aplikacje czasami używają wątków w tle do wykonywania potencjalnie długotrwałych operacji, takich jak pobieranie danych z usługi internetowej. Jeśli kod działający w wątku w tle musi uzyskać dostęp do elementów interfejsu użytkownika, musi on uruchomić ten kod w głównym wątku.
Klasa Device
zawiera następujące static
metody, które mogą służyć do interakcji z elementami interfejsu użytkownika z wątków tła:
Method | Argumenty | Zwraca | Purpose |
---|---|---|---|
BeginInvokeOnMainThread |
Action |
void |
Wywołuje element Action w wątku głównym i nie czeka na jego ukończenie. |
InvokeOnMainThreadAsync<T> |
Func<T> |
Task<T> |
Wywołuje element Func<T> w wątku głównym i czeka na jego ukończenie. |
InvokeOnMainThreadAsync |
Action |
Task |
Wywołuje element Action w wątku głównym i czeka na jego ukończenie. |
InvokeOnMainThreadAsync<T> |
Func<Task<T>> |
Task<T> |
Wywołuje element Func<Task<T>> w wątku głównym i czeka na jego ukończenie. |
InvokeOnMainThreadAsync |
Func<Task> |
Task |
Wywołuje element Func<Task> w wątku głównym i czeka na jego ukończenie. |
GetMainThreadSynchronizationContextAsync |
Task<SynchronizationContext> |
Zwraca wartość SynchronizationContext dla głównego wątku. |
Poniższy kod przedstawia przykład użycia BeginInvokeOnMainThread
metody :
Device.BeginInvokeOnMainThread (() =>
{
// interact with UI elements
});