Xamarin.Forms Device (clase)
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:
- Xamarin_Forms _FlowDirection_LeftToRight" data-linktype="absolute-path">
LeftToRight - Xamarin_Forms _FlowDirection_RightToLeft" data-linktype="absolute-path">
RightToLeft - Xamarin_Forms _FlowDirection_MatchParent" data-linktype="absolute-path">
MatchParent
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
});
Descarga del ejemplo