Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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.iOSvalori di enumerazione , TargetPlatform.AndroidTargetPlatform.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.WinPhoneDevice.Android(deprecate), (deprecate), Device.UWPDevice.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
Phonenei 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
});