Clase Device de Xamarin.FormsXamarin.Forms Device Class

Descargar ejemplo descargar el ejemploDownload Sample Download the sample

La clase Device contiene un número de propiedades y métodos para ayudar a los desarrolladores personalizar diseño y funcionalidad de acuerdo con cada plataforma.The Device class contains a number of properties and methods to help developers customize layout and functionality on a per-platform basis.

Además de los métodos y las propiedades para el código de destino en tipos y tamaños de Device hardware específicos, la clase incluye métodos que se pueden usar para interactuar con los controles de interfaz de usuario de los subprocesos en segundo plano.In addition to methods and properties to target code at specific hardware types and sizes, the Device class includes methods that can be used to interact with UI controls from background threads. Para obtener más información, vea interactuar con la interfaz de usuario de subprocesos en segundo plano.For more information, see Interact with the UI from background threads.

Proporcionar valores específicos de la plataformaProviding platform-specific values

Antes de Xamarin.Forms 2.3.4, se pudo obtener la plataforma de la aplicación se ejecuta en examinando el Device.OS propiedad y compararla con la TargetPlatform.iOS , TargetPlatform.Android , TargetPlatform.WinPhone , y TargetPlatform.Windows valores de enumeración.Prior to Xamarin.Forms 2.3.4, the platform the application was running on could be obtained by examining the Device.OS property and comparing it to the TargetPlatform.iOS, TargetPlatform.Android, TargetPlatform.WinPhone, and TargetPlatform.Windows enumeration values. De forma similar, uno de los Device.OnPlatform sobrecargas podrían usarse para proporcionar los valores específicos de la plataforma a un control.Similarly, one of the Device.OnPlatform overloads could be used to provide platform-specific values to a control.

Sin embargo, desde Xamarin.Forms 2.3.4 estas API se ha desusado y reemplazado.However, since Xamarin.Forms 2.3.4 these APIs have been deprecated and replaced. El Device clase ahora contiene las constantes de cadena pública que identifican las plataformas: Device.iOS , Device.Android , Device.WinPhone() en desuso), Device.WinRT (en desuso) Device.UWP , y Device.macOS .The Device class now contains public string constants that identify platforms – Device.iOS, Device.Android, Device.WinPhone(deprecated), Device.WinRT (deprecated), Device.UWP, and Device.macOS. De forma similar, el Device.OnPlatform sobrecargas se han reemplazado con el OnPlatform y On API.Similarly, the Device.OnPlatform overloads have been replaced with the OnPlatform and On APIs.

En C#, se pueden proporcionar valores específicos por plataforma mediante la creación de una instruccion switch con la propiedad Device.RuntimePlatform y, a continuación, proporcionar las instrucciones case para las plataformas necesarias:In C#, platform-specific values can be provided by creating a switch statement on the Device.RuntimePlatform property, and then providing case statements for the required platforms:

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 clases OnPlatform y On proporcionan la misma funcionalidad en XAML:The OnPlatform and On classes provide the same functionality 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>

El OnPlatform clase es una clase genérica que debe crearse con un x:TypeArguments atributo que coincida con el tipo de destino.The OnPlatform class is a generic class that must be instantiated with an x:TypeArguments attribute that matches the target type. En la clase On , el atributo Platform puede aceptar un único valor string o varios valores string delimitados por comas.In the On class, the Platform attribute can accept a single string value, or multiple comma-delimited string values.

Importante

Proporcionar un valor incorrecto en el atributo Platform de la clase On no producirá un error.Providing an incorrect Platform attribute value in the On class will not result in an error. En su lugar, el código se ejecutará sin el valor específico de la plataforma que se va a aplicar.Instead, the code will execute without the platform-specific value being applied.

Como alternativa, el OnPlatform se puede usar extensión de marcado en XAML para personalizar la apariencia de la interfaz de usuario en forma de acuerdo con la plataforma.Alternatively, the OnPlatform markup extension can be used in XAML to customize UI appearance on a per-platform basis. Para obtener más información, consulte OnPlatform Markup Extension.For more information, see OnPlatform Markup Extension.

Device.IdiomDevice.Idiom

El Device.Idiom propiedad puede usarse para modificar los diseños o funcionalidad en función del dispositivo de la aplicación se ejecuta en.The Device.Idiom property can be used to alter layouts or functionality depending on the device the application is running on. El enumerador TargetIdiom contiene los siguientes valores:The TargetIdiom enumeration contains the following values:

  • Teléfono – iPhone, iPod touch y los dispositivos Android más estrechas que 600 DIP ^Phone – iPhone, iPod touch, and Android devices narrower than 600 dips^
  • Tablet : iPad, los dispositivos de Windows y dispositivos Android más amplio que 600 DIP ^Tablet – iPad, Windows devices, and Android devices wider than 600 dips^
  • Escritorio : solo se devuelven en aplicaciones para UWP en equipos de escritorio de Windows 10 (devuelve Phone en dispositivos móviles de Windows, como en escenarios de Continuum)Desktop – only returned in UWP apps on Windows 10 desktop computers (returns Phone on mobile Windows devices, including in Continuum scenarios)
  • TV: dispositivos de TV con TizenTV – Tizen TV devices
  • Watch – relojes TizenWatch – Tizen watch devices
  • Unsupported : no se utilizaUnsupported – unused

^ DIP no es necesariamente el número de píxeles físicos^ dips is not necessarily the physical pixel count

El Idiom propiedad resulta especialmente útil para la creación de diseños que se benefician de las pantallas más grandes, similar al siguiente:The Idiom property is especially useful for building layouts that take advantage of larger screens, like this:

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

El OnIdiom clase proporciona la misma funcionalidad en XAML:The OnIdiom class provides the same functionality 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>

El OnIdiom clase es una clase genérica que debe crearse con un x:TypeArguments atributo que coincida con el tipo de destino.The OnIdiom class is a generic class that must be instantiated with an x:TypeArguments attribute that matches the target type.

Como alternativa, el OnIdiom se puede usar extensión de marcado en XAML para personalizar la apariencia de la interfaz de usuario en función de la expresión del dispositivo se está ejecutando la aplicación en.Alternatively, the OnIdiom markup extension can be used in XAML to customize UI appearance based on the idiom of the device the application is running on. Para obtener más información, consulte OnIdiom Markup Extension.For more information, see OnIdiom Markup Extension.

Device.FlowDirectionDevice.FlowDirection

El Device.FlowDirection valor recupera un FlowDirection valor de enumeración que representa la dirección del flujo actual que usa el dispositivo.The Device.FlowDirection value retrieves a FlowDirection enumeration value that represents the current flow direction being used by the device. 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.Flow direction is the direction in which the UI elements on the page are scanned by the eye. Los valores de la enumeración son:The enumeration values are:

En XAML, el valor Device.FlowDirection se puede recuperar mediante la extensión de marcado x:Static:In XAML, the Device.FlowDirection value can be retrieved by using the x:Static markup extension:

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

El código equivalente en C# es:The equivalent code in C# is:

this.FlowDirection = Device.FlowDirection;

Para obtener más información acerca de la dirección del flujo, consulte localización de derecha a izquierda.For more information about flow direction, see Right-to-left Localization.

Device.StylesDevice.Styles

La propiedad Styles contiene las definiciones de estilo integradas que pueden aplicarse a algunos de los controles (como Label) la propiedad Style.The Styles property contains built-in style definitions that can be applied to some controls' (such as Label) Style property. Los estilos disponibles son:The available styles are:

  • BodyStyleBodyStyle
  • CaptionStyleCaptionStyle
  • ListItemDetailTextStyleListItemDetailTextStyle
  • ListItemTextStyleListItemTextStyle
  • SubtitleStyleSubtitleStyle
  • TitleStyleTitleStyle

Device.GetNamedSizeDevice.GetNamedSize

GetNamedSize puede utilizarse al establecer FontSize en código C#:GetNamedSize can be used when setting FontSize in C# code:

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.OpenUriDevice.OpenUri

El metodo OpenUri puede usarse para desencadenar operaciones en la plataforma nativa, como abrir una dirección URL en el explorador web nativo (Safari en iOS o Internet en Android).The OpenUri method can be used to trigger operations on the underlying platform, such as open a URL in the native web browser (Safari on iOS or Internet on Android).

Device.OpenUri(new Uri("https://evolve.xamarin.com/"));

El ejemplo WebView incluye un ejemplo que usa OpenUri para abrir las direcciones URL y desencadenar también llamadas telefónicas.The WebView sample includes an example using OpenUri to open URLs and also trigger phone calls.

El ejemplo mapas también usa Device.OpenUri para mostrar mapas y las direcciones mediante la aplicacion de Mapas nativa en iOS y Android.The Maps sample also uses Device.OpenUri to display maps and directions using the native Maps apps on iOS and Android.

Device.StartTimerDevice.StartTimer

La clase Device también tiene un metodo StartTimer que proporciona una manera sencilla de desencadenar tareas dependientes del tiempo que funcionan en el código común de Xamarin.Forms, incluidas una biblioteca .NET Standard.The Device class also has a StartTimer method which provides a simple way to trigger time-dependent tasks that works in Xamarin.Forms common code, including a .NET Standard library. Pasa un valor TimeSpan para establecer el intervalo y devuelve true para mantener el temporizador en ejecución o false para detenerlo después de la invocación actual.Pass a TimeSpan to set the interval and return true to keep the timer running or false to stop it after the current invocation.

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

Si el código del temporizador interactúa con la interfaz de usuario (como establecer el texto de un Label o mostrar una alerta) debe realizarse dentro de una expresión BeginInvokeOnMainThread (ver abajo).If the code inside the timer interacts with the user-interface (such as setting the text of a Label or displaying an alert) it should be done inside a BeginInvokeOnMainThread expression (see below).

Interacción con la interfaz de usuario desde subprocesos en segundo planoInteract with the UI from background threads

La mayoría de los sistemas operativos, incluidos iOS, Android y el Plataforma universal de Windows, utilizan un modelo de subprocesamiento único para el código que implica la interfaz de usuario.Most operating systems, including iOS, Android, and the Universal Windows Platform, use a single-threading model for code involving the user interface. Este subproceso se llama a menudo el subproceso principal o el subprocesode la interfaz de usuario.This thread is often called the main thread or the UI thread. Una consecuencia de este modelo es que todo el código que tiene acceso a los elementos de la interfaz de usuario se debe ejecutar en el subproceso principal de la aplicación.A consequence of this model is that all code that accesses user interface elements must run on the application's main thread.

A veces, las aplicaciones utilizan subprocesos en segundo plano para realizar operaciones que pueden tardar mucho tiempo, como recuperar datos de un servicio Web.Applications sometimes use background threads to perform potentially long running operations, such as retrieving data from a web service. 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.If code running on a background thread needs to access user interface elements, it must run that code on the main thread.

La Device clase incluye los siguientes static métodos que se pueden usar para interactuar con los elementos de la interfaz de usuario de los subprocesos de fondo:The Device class includes the following static methods that can be used to interact with user interface elements from backgrounds threads:

MétodoMethod ArgumentosArguments DevuelveReturns PropósitoPurpose
BeginInvokeOnMainThread Action void Invoca un Action en el subproceso principal y no espera a que se complete.Invokes an Action on the main thread, and doesn't wait for it to complete.
InvokeOnMainThreadAsync<T> Func<T> Task<T> Invoca un elemento Func<T> en el subproceso principal y espera a que se complete.Invokes a Func<T> on the main thread, and waits for it to complete.
InvokeOnMainThreadAsync Action Task Invoca un elemento Action en el subproceso principal y espera a que se complete.Invokes an Action on the main thread, and waits for it to complete.
InvokeOnMainThreadAsync<T> Func<Task<T>> Task<T> Invoca un elemento Func<Task<T>> en el subproceso principal y espera a que se complete.Invokes a Func<Task<T>> on the main thread, and waits for it to complete.
InvokeOnMainThreadAsync Func<Task> Task Invoca un elemento Func<Task> en el subproceso principal y espera a que se complete.Invokes a Func<Task> on the main thread, and waits for it to complete.
GetMainThreadSynchronizationContextAsync Task<SynchronizationContext> Devuelve el elemento SynchronizationContext para el subproceso principal.Returns the SynchronizationContext for the main thread.

En el código siguiente se muestra un ejemplo del BeginInvokeOnMainThread uso del método:The following code shows an example of using the BeginInvokeOnMainThread method:

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