Xamarin.Forms Classe Device
La Device
classe contiene una serie di proprietà e metodi che consentono agli sviluppatori di personalizzare il layout e le funzionalità in base alla piattaforma.
Oltre a metodi e proprietà per impostare come destinazione il codice a tipi e dimensioni hardware specifici, la Device
classe include metodi che possono essere usati per interagire con i controlli dell'interfaccia utente dai thread in background. Per altre informazioni, vedere Interagire con l'interfaccia utente dai thread in background.
Specificare valori specifici della piattaforma
Prima della Xamarin.Forms versione 2.3.4, la piattaforma in cui era in esecuzione l'applicazione poteva essere ottenuta esaminando la Device.OS
proprietà e confrontandola con i TargetPlatform.iOS
valori di enumerazione , TargetPlatform.Android
TargetPlatform.WinPhone
, e TargetPlatform.Windows
. Analogamente, uno degli Device.OnPlatform
overload può essere usato per fornire valori specifici della piattaforma a un controllo .
Tuttavia, dalla Xamarin.Forms versione 2.3.4 queste API sono state deprecate e sostituite. La Device
classe contiene ora costanti di stringa pubblica che identificano le piattaforme , Device.iOS
, Device.WinPhone
Device.Android
(deprecate), (deprecate), Device.UWP
Device.WinRT
e Device.macOS
. Analogamente, gli Device.OnPlatform
overload sono stati sostituiti con le OnPlatform
API e On
.
In C#, i valori specifici della piattaforma possono essere forniti creando un'istruzione switch
sulla Device.RuntimePlatform
proprietà e quindi fornendo case
istruzioni per le piattaforme necessarie:
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);
Le OnPlatform
classi e On
forniscono le stesse funzionalità 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>
La OnPlatform
classe è una classe generica di cui è necessario creare un'istanza con un x:TypeArguments
attributo corrispondente al tipo di destinazione. On
Nella classe l'attributo Platform
può accettare un singolo string
valore o più valori delimitati da string
virgole.
Importante
Se si specifica un valore di attributo non corretto Platform
nella On
classe, non verrà generato un errore. Il codice verrà invece eseguito senza applicare il valore specifico della piattaforma.
In alternativa, l'estensione OnPlatform
di markup può essere usata in XAML per personalizzare l'aspetto dell'interfaccia utente in base alla piattaforma. Per altre informazioni, vedere Estensione di markup OnPlatform.
Device.Idiom
La Device.Idiom
proprietà può essere usata per modificare layout o funzionalità a seconda del dispositivo in cui è in esecuzione l'applicazione. L'enumerazione TargetIdiom
contiene i valori seguenti:
- Telefono : dispositivi iPhone, iPod touch e Android più stretti di 600 dips^
- Tablet : iPad, dispositivi Windows e dispositivi Android più ampi di 600 dips^
- Desktop: restituito solo nelle app UWP nei computer desktop Windows 10 (restituisce
Phone
nei dispositivi Windows mobili, inclusi gli scenari Continuum) - TV - Dispositivi Tv Tizen
- Orologio - Dispositivi di controllo Tizen
- Non supportato : non usato
^ dips non è necessariamente il numero di pixel fisici
La Idiom
proprietà è particolarmente utile per la creazione di layout che sfruttano schermi più grandi, come illustrato di seguito:
if (Device.Idiom == TargetIdiom.Phone) {
// layout views vertically
} else {
// layout views horizontally for a larger display (tablet or desktop)
}
La OnIdiom
classe fornisce la stessa funzionalità 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>
La OnIdiom
classe è una classe generica di cui è necessario creare un'istanza con un x:TypeArguments
attributo corrispondente al tipo di destinazione.
In alternativa, l'estensione OnIdiom
di markup può essere usata in XAML per personalizzare l'aspetto dell'interfaccia utente in base all'idioma del dispositivo in cui è in esecuzione l'applicazione. Per altre informazioni, vedere Estensione di markup OnIdiom.
Device.FlowDirection
Il Device.FlowDirection
valore recupera un FlowDirection
valore di enumerazione che rappresenta la direzione corrente del flusso utilizzata dal dispositivo. La direzione del flusso è la direzione in cui gli elementi dell'interfaccia utente della pagina vengono analizzati dall'occhio del lettore. I valori dell'enumerazione sono:
In XAML il Device.FlowDirection
valore può essere recuperato usando l'estensione di x:Static
markup:
<ContentPage ... FlowDirection="{x:Static Device.FlowDirection}"> />
Il codice equivalente in C# è:
this.FlowDirection = Device.FlowDirection;
Per altre informazioni sulla direzione del flusso, vedere Localizzazione da destra a sinistra.
Device.Styles
La Styles
proprietà contiene definizioni di stile predefinite che possono essere applicate a alcune proprietà dei controlli, ad esempio Label
. Style
Gli stili disponibili sono:
- BodyStyle
- CaptionStyle
- ListItemDetailTextStyle
- ListItemTextStyle
- SubtitleStyle
- TitleStyle
Device.GetNamedSize
GetNamedSize
può essere usato quando si imposta FontSize
nel codice 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 introduce il supporto per i colori denominati. Un colore denominato è un colore che ha un valore diverso a seconda della modalità di sistema (ad esempio, chiaro o scuro) nel dispositivo. In Android, i colori denominati sono accessibili tramite la classe R.Color . In iOS i colori denominati sono denominati colori di sistema. Nella piattaforma UWP (Universal Windows Platform) i colori denominati sono denominati risorse del tema XAML.
Il GetNamedColor
metodo può essere usato per recuperare i colori denominati in Android, iOS e UWP. Il metodo accetta un string
argomento e restituisce un oggetto Color
:
// Retrieve an Android named color
Color color = Device.GetNamedColor(NamedPlatformColor.HoloBlueBright);
Color.Default
verrà restituito quando non è possibile trovare un nome di colore o quando GetNamedColor
viene richiamato su una piattaforma non supportata.
Nota
Poiché il GetNamedColor
metodo restituisce un Color
oggetto specifico di una piattaforma, in genere deve essere usato insieme alla Device.RuntimePlatform
proprietà .
La NamedPlatformColor
classe contiene le costanti che definiscono i colori denominati per Android, iOS e UWP:
Android | iOS | macOS | Piattaforma 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 Device
classe include anche un metodo che fornisce un StartTimer
modo semplice per attivare attività dipendenti dal tempo che funzionano nel Xamarin.Forms codice comune, inclusa una libreria .NET Standard. Passare un TimeSpan
oggetto per impostare l'intervallo e tornare true
a mantenere il timer in esecuzione o false
per arrestarlo dopo la chiamata corrente.
Device.StartTimer (new TimeSpan (0, 0, 60), () =>
{
// do something every 60 seconds
return true; // runs again, or false to stop
});
Se il codice all'interno del timer interagisce con l'interfaccia utente ,ad esempio impostando il testo di un Label
oggetto o visualizzando un avviso, deve essere eseguito all'interno di un'espressione BeginInvokeOnMainThread
(vedere di seguito).
Nota
Le System.Timers.Timer
classi e System.Threading.Timer
sono alternative .NET Standard all'uso del Device.StartTimer
metodo .
Interagire con l'interfaccia utente dai thread in background
La maggior parte dei sistemi operativi, tra cui iOS, Android e il piattaforma UWP (Universal Windows Platform), usa un modello a threading singolo per il codice che coinvolge l'interfaccia utente. Questo thread viene spesso chiamato thread principale o thread dell'interfaccia utente. Una conseguenza di questo modello è che tutto il codice che accede agli elementi dell'interfaccia utente deve essere eseguito nel thread principale dell'applicazione.
Le applicazioni talvolta usano thread in background per eseguire operazioni potenzialmente a esecuzione prolungata, ad esempio il recupero di dati da un servizio Web. Se il codice in esecuzione in un thread in background deve accedere agli elementi dell'interfaccia utente, deve eseguire tale codice nel thread principale.
La Device
classe include i metodi seguenti static
che possono essere usati per interagire con gli elementi dell'interfaccia utente dai thread in background:
metodo | Argomenti | Valori restituiti | Scopo |
---|---|---|---|
BeginInvokeOnMainThread |
Action |
void |
Richiama un oggetto Action nel thread principale e non attende il completamento. |
InvokeOnMainThreadAsync<T> |
Func<T> |
Task<T> |
Richiama un oggetto Func<T> sul thread principale e ne attende il completamento. |
InvokeOnMainThreadAsync |
Action |
Task |
Richiama un oggetto Action sul thread principale e ne attende il completamento. |
InvokeOnMainThreadAsync<T> |
Func<Task<T>> |
Task<T> |
Richiama un oggetto Func<Task<T>> sul thread principale e ne attende il completamento. |
InvokeOnMainThreadAsync |
Func<Task> |
Task |
Richiama un oggetto Func<Task> sul thread principale e ne attende il completamento. |
GetMainThreadSynchronizationContextAsync |
Task<SynchronizationContext> |
Restituisce l'oggetto SynchronizationContext per il thread principale. |
Il codice seguente illustra un esempio di utilizzo del BeginInvokeOnMainThread
metodo :
Device.BeginInvokeOnMainThread (() =>
{
// interact with UI elements
});