Xamarin.Forms Device (clase)

Ejemplo de descarga Descarga del ejemplo

La clase contiene una serie de propiedades y métodos para ayudar a los desarrolladores a personalizar el diseño y la Device funcionalidad por plataforma.

Además de los métodos y propiedades para el código de destino en tamaños y tipos de hardware específicos, la clase incluye métodos que se pueden usar para interactuar con controles de interfaz de usuario desde subprocesos Device en segundo plano. Para obtener más información, vea Interactuar con la interfaz de usuario desde subprocesos en segundo plano.

Proporcionar valores específicos de la plataforma

Antes de la versión 2.3.4, la plataforma en la que se estaba ejecutando la aplicación se podía obtener examinando la propiedad Xamarin.Forms Xamarin_Forms Xamarin.Forms _Device_OS" data-linktype="absolute-path">y comparándolo con la propiedad Device.OS Xamarin_Forms _TargetPlatform_iOS" data-linktype=. "absolute-path">TargetPlatform.iOS , Xamarin_Forms Device.OS _TargetPlatform_Android" data-linktype="absolute-path">, Xamarin_Forms TargetPlatform.Android _TargetPlatform_WinPhone" data-linktype="absolute-path">TargetPlatform.WinPhone , y Xamarin_Forms _TargetPlatform_Windows" data-linktype="absolute-path">TargetPlatform.Windows enumeración. De forma similar, una de las sobrecargas Xamarin_Forms _Device_OnPlatform_System_Action_System_Action_System_Action_System_Action_" data-linktype="absolute-path">podría usarse para proporcionar valores específicos de la plataforma Device.OnPlatform a un control.

Sin embargo, Xamarin.Forms desde la versión 2.3.4, estas API han quedado en desuso y se han reemplazado. La clase ahora contiene constantes de cadena pública que identifican las Device plataformas : , , (en desuso), (en desuso), Device.iOS y Device.AndroidDevice.WinPhoneDevice.WinRTDevice.UWPDevice.macOS . Del mismo modo, Xamarin_Forms _Device_OnPlatform_System_Action_System_Action_System_Action_System_Action_" data-linktype="absolute-path">Device.OnPlatform sobrecargas OnPlatform se han reemplazado por las On API y .

En C#, se pueden proporcionar valores específicos de la plataforma creando una instrucción en la propiedad switchswitch data-linktype="absolute-path">de Xamarin_Forms _Device_RuntimePlatform" y proporcionando instrucciones para las Device.RuntimePlatformcase plataformas necesarias:

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);

Las OnPlatform clases y proporcionan la misma funcionalidad en On 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>

La clase es una clase genérica a la que se deben crear instancias OnPlatform con un atributo que coincida con el tipo de x:TypeArguments destino. En la clase , el atributo On Xamarin_Forms On _On_Platform" data-linktype="absolute-path">puede aceptar un solo valor o varios valores delimitados Platform por stringstring comas.

Importante

Si se proporciona Platform un valor de atributo incorrecto en la clase , no se producirá un On error. En su lugar, el código se ejecutará sin que se aplique el valor específico de la plataforma.

Como alternativa, la extensión de marcado se puede usar en XAML para personalizar la apariencia de la interfaz OnPlatform de usuario por plataforma. Para obtener más información, vea Extensión de marcado OnPlatform.

Device.Idiom

La Device.Idiom propiedad se puede usar para modificar los diseños o la funcionalidad en función del dispositivo en el que se ejecuta la aplicación. La enumeración TargetIdiom contiene los valores siguientes:

  • Teléfono: iPhone, iPod touch y Dispositivos Android más estrechos que 600 dips^
  • Tableta: iPad, Windows dispositivos y dispositivos Android más amplios que 600 dips^
  • Escritorio: solo se devuelve en aplicaciones para UWP Windows 10 equipos de escritorio (se devuelve en dispositivos Windows móviles, incluidos los escenarios de continuum).
  • TV: dispositivos tizen TV
  • Watch: dispositivos Detezen Watch
  • No compatible: sin usar

^ las caídas no son necesariamente el recuento de píxeles físicos

La Idiom propiedad es especialmente útil para crear diseños que aprovechan las pantallas más grandes, como esta:

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

La OnIdiom clase proporciona la misma funcionalidad en 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>

La clase es una clase genérica a la que se deben crear instancias OnIdiom con un atributo que coincida con el tipo de x:TypeArguments destino.

Como alternativa, la extensión de marcado se puede usar en XAML para personalizar la apariencia de la interfaz de usuario en función de la expresión del dispositivo en el que OnIdiom se ejecuta la aplicación. Para obtener más información, vea Extensión de marcado OnIdiom.

Device.FlowDirection

El Xamarin_Forms _VisualElement_FlowDirection" data-linktype="absolute-path">recupera un valor de enumeración que representa la dirección del flujo actual que usa Device.FlowDirectionFlowDirection el dispositivo. La dirección de flujo es la dirección en la que el ojo humano lee los elementos de la interfaz de usuario en la página. Los valores de la enumeración son:

En XAML, el valor Xamarin_Forms _VisualElement_FlowDirection" data-linktype="absolute-path">se puede recuperar mediante la Device.FlowDirection extensión de x:Static marcado:

<ContentPage ... FlowDirection="{x:Static Device.FlowDirection}"> />

El código equivalente en C# es:

this.FlowDirection = Device.FlowDirection;

Para obtener más información sobre la dirección del flujo, vea Localización de derecha a izquierda.

Device.Styles

La propiedad contiene definiciones de estilo integradas que se pueden aplicar a algunos controles de la propiedad (por ejemplo, Label ). Style Los estilos disponibles son:

  • BodyStyle
  • CaptionStyle
  • ListItemDetailTextStyle
  • ListItemTextStyle
  • SubtitleStyle
  • TitleStyle

Device.GetNamedSize

GetNamedSize se puede usar al establecer FontSize en código de 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 presenta compatibilidad con colores con nombre. Un color con nombre es un color que tiene un valor diferente en función del modo del sistema (por ejemplo, claro u oscuro) que está activo en el dispositivo. En Android, se accede a los colores con nombre a través de la clase R.Color. En iOS, los colores con nombre se denominan colores del sistema. En la Plataforma Windows universal, los colores con nombre se denominan recursos de tema XAML.

El GetNamedColor método se puede usar para recuperar colores con nombre en Android, iOS y UWP. El método toma un string argumento y devuelve Color :

// Retrieve an Android named color
Color color = Device.GetNamedColor(NamedPlatformColor.HoloBlueBright);

Color.Default se devolverá cuando no se encuentra un nombre de color o cuando GetNamedColor se invoca en una plataforma no compatible.

Nota:

Dado que el método devuelve un que es específico de una plataforma, normalmente se debe usar junto con la propiedad GetNamedColorColor Xamarin_Forms GetNamedColor _Device_RuntimePlatform" data-linktype="absolute-path">. Device.RuntimePlatform

La NamedPlatformColor clase contiene las constantes que definen los colores con nombre para Android, iOS y UWP:

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

La clase también tiene un método que proporciona una manera sencilla de desencadenar tareas dependientes del tiempo que funcionan en código común, incluida DeviceStartTimer .NET Standard Xamarin.Forms biblioteca. Pase un para establecer el intervalo y vuelva para mantener el TimeSpan temporizador en ejecución o para detenerlo después de la truefalse invocación actual.

Device.StartTimer (new TimeSpan (0, 0, 60), () =>
{
    // do something every 60 seconds
    return true; // runs again, or false to stop
});

Si el código dentro del temporizador interactúa con la interfaz de usuario (como establecer el texto de o mostrar una alerta), debe realizarse dentro de una expresión Label (consulte a BeginInvokeOnMainThread continuación).

Nota:

Las System.Timers.Timer clases y .NET Standard System.Threading.Timer alternativas al uso del método Device.StartTimer .

Interacción con la interfaz de usuario desde subprocesos en segundo plano

La mayoría de los sistemas operativos, incluidos iOS, Android y universal Windows Platform, usan un modelo de subproceso único para el código que implica la interfaz de usuario. Este subproceso se suele denominar subproceso principal o subproceso de interfaz de usuario. Una consecuencia de este modelo es que todo el código que tiene acceso a los elementos de la interfaz de usuario debe ejecutarse en el subproceso principal de la aplicación.

A veces, las aplicaciones usan subprocesos en segundo plano para realizar operaciones de ejecución potencialmente larga, como recuperar datos de un servicio web. Si el código que se ejecuta en un subproceso en segundo plano necesita acceder a los elementos de la interfaz de usuario, debe ejecutar ese código en el subproceso principal.

La clase incluye los métodos siguientes que se pueden usar para interactuar con elementos de Device interfaz de usuario de static subprocesos en segundo plano:

Método Argumentos Valores devueltos Propósito
BeginInvokeOnMainThread Action void Invoca un Action en el subproceso principal y no espera a que se complete.
InvokeOnMainThreadAsync<T> Func<T> Task<T> Invoca un elemento Func<T> en el subproceso principal y espera a que se complete.
InvokeOnMainThreadAsync Action Task Invoca un elemento Action en el subproceso principal y espera a que se complete.
InvokeOnMainThreadAsync<T> Func<Task<T>> Task<T> Invoca un elemento Func<Task<T>> en el subproceso principal y espera a que se complete.
InvokeOnMainThreadAsync Func<Task> Task Invoca un elemento Func<Task> en el subproceso principal y espera a que se complete.
GetMainThreadSynchronizationContextAsync Task<SynchronizationContext> Devuelve el elemento SynchronizationContext para el subproceso principal.

En el código siguiente se muestra un ejemplo de uso del BeginInvokeOnMainThread método :

Device.BeginInvokeOnMainThread (() =>
{
    // interact with UI elements
});