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 métodos y propiedades para asignar como destino código en tipos y tamaños específicos de harwdware, la clase Device incluye el método BeginInvokeOnMainThread que se debe usar al interactuar con controles de la interfaz de usuario desde subprocesos en segundo plano.In addition to methods and properties to target code at specific hardware types and sizes, the Device class includes the BeginInvokeOnMainThread method which should be used when interacting with UI controls from background threads.

Proporcionando valores específicos de 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).

Device.BeginInvokeOnMainThreadDevice.BeginInvokeOnMainThread

Nunca se deben tener acceso a los elementos de la interfaz de usuario por los subprocesos en segundo plano, por ejemplo, el código que se ejecuta en un temporizador o un controlador de finalización para las operaciones asincrónicas, como las solicitudes web.User interface elements should never be accessed by background threads, such as code running in a timer or a completion handler for asynchronous operations like web requests. Cualquier código en segundo plano que se deba actualizar la interfaz de usuario se debe incluir en BeginInvokeOnMainThread .Any background code that needs to update the user interface should be wrapped inside BeginInvokeOnMainThread. Este es el equivalente de InvokeOnMainThread en iOS, RunOnUiThread en Android, y Dispatcher.RunAsync en la plataforma Universal de Windows.This is the equivalent of InvokeOnMainThread on iOS, RunOnUiThread on Android, and Dispatcher.RunAsync on the Universal Windows Platform.

El código de Xamarin.Forms es:The Xamarin.Forms code is:

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

Tenga en cuenta que los métodos mediante async/await no es necesario usar BeginInvokeOnMainThread si se están ejecutando en el subproceso de interfaz de usuario principal.Note that methods using async/await do not need to use BeginInvokeOnMainThread if they are running from the main UI thread.

ResumenSummary

La clase Device de Xamarin.Forms permite un mayor control sobre la funcionalidad y los diseños por plataforma: incluso en código comun (proyectos de biblioteca de .NET Standard o proyectos compartidos).The Xamarin.Forms Device class allows fine-grained control over functionality and layouts on a per-platform basis - even in common code (either .NET Standard library projects or Shared Projects).