Xamarin.Forms Klasa urządzenia

Pobierz przykład Pobieranie przykładu

Klasa Device zawiera wiele właściwości i metod, które ułatwiają deweloperom dostosowywanie układu i funkcjonalności na podstawie poszczególnych platform.

Oprócz metod i właściwości docelowych kodu 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.

Podawanie wartości specyficznych dla platformy

Xamarin.Forms Przed 2.3.4 można uzyskać platformę uruchomioną przez aplikację, sprawdzając Device.OS właściwość i porównując ją z wartościami TargetPlatform.iOS, TargetPlatform.Android, TargetPlatform.WinPhonei wyliczeniaTargetPlatform.Windows. Podobnie jeden z Device.OnPlatform przeciążeń może służyć do udostępniania wartości specyficznych dla platformy do kontrolki.

Jednak od Xamarin.Forms wersji 2.3.4 te interfejsy API zostały przestarzałe i zastąpione. Klasa Device zawiera teraz stałe ciągów publicznych identyfikujące platformy — Device.iOS, , Device.WinPhoneDevice.Android(przestarzałe), (przestarzałe), Device.UWPDevice.WinRT i Device.macOS. Device.OnPlatform Podobnie przeciążenia zostały zastąpione interfejsami OnPlatform API iOn.

W języku C#wartości specyficzne dla platformy można podać przez utworzenie switch instrukcji we Device.RuntimePlatform właściwości, a następnie podanie case instrukcji 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órą należy utworzyć za pomocą atrybutu zgodnego z x:TypeArguments typem docelowym. On W klasie Platform atrybut może akceptować pojedynczą string wartość lub wiele wartości rozdzielanych 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 rozszerzenie OnPlatform znaczników może służyć w języku XAML do dostosowywania wyglądu interfejsu użytkownika na podstawie platformy. 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 — telefon iPhone, iPod touch i urządzenia z systemem Android węższe niż 600 dips^
  • Tablet — urządzenia iPad, urządzenia z systemem Windows i urządzenia z systemem Android szersze niż 600 spadków^
  • Desktop — zwracany tylko w aplikacjach platformy UWP na komputerach stacjonarnych Windows 10 (zwraca się Phone na urządzeniach przenośnych z systemem Windows, w tym w scenariuszach Continuum)
  • TV – urządzenia telewizyjne Tizen
  • Obejrzyj — urządzenia watch Tizen
  • Nieobsługiwane — nieużywane

^ spadki niekoniecznie są liczbą pikseli fizycznych

Właściwość jest szczególnie przydatna Idiom w przypadku układów konstrukcyjnych, które korzystają z większych ekranów, w następujący sposób:

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

Klasa OnIdiom zapewnia tę samą funkcjonalność 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órą należy utworzyć za pomocą atrybutu zgodnego z x:TypeArguments typem docelowym.

Alternatywnie rozszerzenie OnIdiom znaczników może być używane w języku XAML w celu dostosowania wyglądu 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, która reprezentuje 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 XAML Device.FlowDirection można pobrać wartość 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 stylu, 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
  • PodtytułStyle
  • Titlestyle

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 trybu systemowego (na przykład jasnego lub ciemnego) 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. W 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 powró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 (na przykład ustawianie tekstu Label lub wyświetlania alertu), należy wykonać go 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 wątkiem głównym 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 uzyskiwać dostęp do elementów interfejsu użytkownika, musi uruchomić ten kod w głównym wątku.

Klasa Device zawiera następujące static metody, których można użyć do interakcji z elementami interfejsu użytkownika z wątków tła:

Metoda Argumenty Zwraca Przeznaczenie
BeginInvokeOnMainThread Action void Wywołuje element Action w wątku głównym i nie czeka na ukończenie.
InvokeOnMainThreadAsync<T> Func<T> Task<T> Wywołuje element Func<T> w wątku głównym i czeka na zakończenie.
InvokeOnMainThreadAsync Action Task Wywołuje element Action w wątku głównym i czeka na zakończenie.
InvokeOnMainThreadAsync<T> Func<Task<T>> Task<T> Wywołuje element Func<Task<T>> w wątku głównym i czeka na zakończenie.
InvokeOnMainThreadAsync Func<Task> Task Wywołuje element Func<Task> w wątku głównym i czeka na zakoń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
});