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.
Modelli di controllo
WPF supporta il concetto di modelli di controllo che forniscono le istruzioni di visualizzazione per un controllo (Button, ListBoxe così via). Come accennato in precedenza, Xamarin.Forms usa classi di rendering concrete per questo che interagiscono con la piattaforma nativa (iOS, Android e così via) per visualizzare il controllo.
Tuttavia, Xamarin.Forms ha un ControlTemplate tipo , che viene usato per il tema degli Page oggetti. Fornisce una definizione per un Page oggetto che fornisce contenuto coerente, ma consente all'utente della pagina di modificare colori, tipi di carattere e così via e persino aggiungere elementi per renderlo univoco per l'applicazione.
Gli utilizzi comuni di questo tipo sono operazioni quali finestre di dialogo di autenticazione, richieste e per fornire un aspetto di pagina standardizzato, ma che può essere personalizzato all'interno dell'app. Come parte di questo supporto, vengono usati molti controlli denominati WPF familiari:
ContentPageContentViewContentPresenterTemplateBinding
Ma è importante sapere che questi non servono allo stesso scopo in Xamarin.Forms. Per altre informazioni su questa funzionalità, vedere la pagina della documentazione.
XAML
XAML viene usato come linguaggio di markup dichiarativo per WPF e Xamarin.Forms. Nella maggior parte dei casi, la sintassi è identica: la differenza principale è gli oggetti definiti/creati dai grafici XAML.
Xamarin.Forms supporta la specifica XAML 2009. Ciò semplifica la definizione di dati,
stringad esempio s,ints e così via, nonché la definizione di tipi generici e il passaggio di argomenti ai costruttori.Attualmente non è possibile caricare in modo dinamico XAML come WPF con
XamlReader. È tuttavia possibile ottenere la stessa funzionalità di base con un pacchetto NuGet.
Estensioni di markup
Xamarin.Forms supporta l'estensione XAML tramite estensioni di markup, in modo analogo a WPF. Predefinito, ha gli stessi blocchi predefiniti di base:
{x:Array}{Binding}{DynamicResource}{x:Null}{x:Static}{StaticResource}{x:Type}
Include inoltre {x:Reference} dalla specifica XAML 2009 e un'estensione {TemplateBinding} di markup usata per la versione specializzata di ControlTemplate supportata da Xamarin.Forms.
Avviso
Il ControlTemplate supporto non è lo stesso, anche se ha lo stesso nome.
Xamarin.Forms supporta anche estensioni di markup personalizzate, ma l'implementazione è leggermente diversa. In WPF è necessario derivare da MarkupExtension una classe base astratta. In Xamarin.Forms, che viene sostituito con un'interfaccia IMarkupExtension o IMarkupExtension<T> che è più flessibile.
Analogamente a WPF, il singolo metodo obbligatorio è un ProvideValue metodo per restituire il valore dall'estensione di markup.
Infrastruttura di associazione
Uno dei concetti di base eseguiti è un'infrastruttura di data binding per connettere le proprietà visive alle proprietà dei dati .NET. In questo modo è possibile abilitare modelli architetturali come MVVM. La progettazione di base è identica: si dispone di una classe di base associabile BindableObject, in WPF si tratta della classe DependencyObject . Questa classe di base viene usata come predecessore radice per tutti gli oggetti che partecipano come destinazioni nel data binding. Le classi derivate espongono quindi oggetti BindableProperty che fungono da risorsa di archiviazione di supporto per i valori delle proprietà ,definiti come oggetti DependencyProperty in WPF.
Definizione di proprietà associabili
La definizione di una proprietà associabile in Xamarin.Forms è identica a WPF:
- L'oggetto deve derivare da
BindableObject. - Deve essere presente un campo statico pubblico di tipo
BindablePropertydichiarato per definire la chiave di archiviazione sottostante per la proprietà . - Deve essere presente un wrapper di proprietà dell'istanza pubblica che usa
GetValueeSetValueper recuperare e modificare il valore delle proprietà.
Per un esempio completo, vedere Proprietà associabili in Xamarin.Forms.
Proprietà associate
Le proprietà associate sono un subset della proprietà associabile e funzionano allo stesso modo in WPF. La differenza principale è che il wrapper della proprietà viene omesso in questo caso e sostituito con un set di metodi get/set statici nella classe proprietaria. Per altre informazioni, vedere Proprietà associate in Xamarin.Forms .
Uso del motore di associazione
Il processo per l'uso del motore di associazione è identico a quello in WPF. Può essere utilizzato nel code-behind creando un Binding oggetto associato a un oggetto di origine (qualsiasi tipo .NET) e un valore di proprietà facoltativo (se omesso, considera l'oggetto di origine come la proprietà stessa, proprio come WPF). È quindi possibile usare SetBinding su qualsiasi BindableObject oggetto per associare l'associazione a un oggetto BindableProperty.
In alternativa, puoi definire la relazione di associazione in XAML usando .BindingExtension Ha gli stessi valori di base dell'estensione in WPF.
Il supporto dell'associazione e il motore sono più simili all'implementazione di Silverlight rispetto a WPF. Esistono diverse funzionalità mancanti che non sono state implementate in Xamarin.Forms:
- Nelle associazioni non è disponibile alcun supporto per le funzionalità seguenti:
- BindingGroupName
- BindsDirectlyToSource
- IsAsync
- MultiBinding
- NotifyOnSourceUpdated
- NotifyOnTargetUpdated
- NotifyOnValidationError
- UpdateSourceTrigger
- UpdateSourceExceptionFilter
- ValidatesOnDataErrors
- ValidatesOnExceptions
- Insieme ValidationRules
- XPath
- XmlNamespaceManager
RelativeSource
Non è disponibile alcun supporto per RelativeSource le associazioni. In WPF, questi consentono di eseguire il binding ad altri elementi visivi definiti in XAML. In Xamarin.Forms questa stessa funzionalità può essere ottenuta usando l'estensione di {x:Reference} markup. Ad esempio, supponendo che sia presente un controllo con il nome "otherControl" con una proprietà Text, è possibile associarlo come segue:
WPF
Text={Binding RelativeSource={RelativeSource otherControl}, Path=Text}
Xamarin.Forms
Text={Binding Source={x:Reference otherControl}, Path=Text}
La stessa funzionalità può essere usata per la {RelativeSource Self} funzionalità. Non esiste tuttavia alcun supporto per l'individuazione dei predecessori per tipo ({RelativeSource FindAncestor}).
Contesto di associazione
In WPF è possibile definire un DataContext valore della proprietà che esegue la replica dell'origine di associazione predefinita. Se l'origine di un'associazione non è definita, viene utilizzato questo valore della proprietà. Il valore viene ereditato nella struttura ad albero visuale, consentendo di definirlo a un livello superiore e quindi utilizzato dagli elementi figlio.
In Xamarin.Forms questa stessa funzionalità è disponibile, ma il nome della proprietà è BindingContext.
Convertitori di valori
I convertitori di valori sono completamente supportati in Xamarin.Forms, proprio come WPF. Viene usata la stessa forma di interfaccia, ma Xamarin.Forms ha l'interfaccia definita nello spazio dei Xamarin.Forms nomi .
Model-View-ViewModel
MVVM è completamente supportato sia da WPF che da Xamarin.Forms.
WPF include un'predefinito che RoutedCommand a volte viene usata; Xamarin.Forms non dispone di alcun supporto predefinito per i comandi oltre la definizione dell'interfaccia ICommand . È possibile includere un'ampia gamma di framework MVVM per aggiungere le classi di base necessarie per implementare MVVM.
INotifyPropertyChanged e INotifyCollectionChanged
Entrambe le interfacce sono completamente supportate nelle associazioni Xamarin.Forms. A differenza di molti framework basati su XAML, le notifiche di modifica delle proprietà possono essere generate nei thread in background in Xamarin.Forms (proprio come WPF) e il motore di associazione passerà correttamente al thread dell'interfaccia utente.
Inoltre, entrambi gli ambienti supportano SynchronizationContext e async/await per eseguire il marshalling di thread appropriato. WPF include la Dispatcher classe in tutti gli elementi visivi, Xamarin.Forms ha un metodo Device.BeginInvokeOnMainThread statico che può essere usato anche (anche se SynchronizationContext è preferibile per la codifica multipiattaforma).
- Xamarin.Forms include un oggetto
ObservableCollection<T>che supporta le notifiche di modifica della raccolta. - È possibile usare
BindingBase.EnableCollectionSynchronizationper abilitare gli aggiornamenti tra thread per una raccolta. L'API è leggermente diversa dalla variante WPF. Per informazioni dettagliate sull'utilizzo, vedere la documentazione.
Modelli di dati
I modelli di dati sono supportati in Xamarin.Forms per personalizzare il rendering di una ListView riga (cella). A differenza di WPF che può usare DataTemplates per qualsiasi controllo orientato al contenuto, Xamarin.Forms attualmente li usa solo per ListView. La definizione del modello può essere definita inline (assegnata alla ItemTemplate proprietà) o come risorsa in un oggetto ResourceDictionary.
Inoltre, non sono abbastanza flessibili come la loro controparte WPF.
- L'elemento radice di
DataTemplatedeve essere sempre unViewCelloggetto . - I trigger di dati sono completamente supportati in un modello di dati, ma devono includere una
DataTypeproprietà che indica il tipo della proprietà a cui è associato il trigger. DataTemplateSelectorè supportato anche, ma deriva daDataTemplatee viene quindi semplicemente assegnato direttamente allaItemTemplateproprietà (rispettoItemTemplateSelectora IN WPF).
ItemsControl
Non esiste un equivalente predefinito a in ItemsControl Xamarin.Forms, ma ne è disponibile uno personalizzato per Xamarin.Forms qui.
Controlli utente
In WPF UserControlvengono usati s per fornire una sezione dell'interfaccia utente che ha associato il comportamento. In Xamarin.Forms viene usato ContentView per lo stesso scopo. Supporta sia l'associazione che l'inclusione in XAML.
Navigazione
WPF include raramente un oggetto usato che può essere usato NavigationService per fornire una funzionalità di spostamento "simile al browser". La maggior parte delle app non si preoccupava di questo, ma usava invece elementi diversi Window o sezioni diverse della finestra per visualizzare i dati.
Nei dispositivi telefonici, le diverse schermate sono spesso la soluzione e quindi Xamarin.Forms include il supporto per diverse forme di spostamento:
| Stile di spostamento | Tipo di pagina |
|---|---|
| Basato su stack (push/pop) | NavigationPage |
| Report master o di dettaglio | MasterDetailPage |
| Schede | TabbedPage |
| Scorrimento rapido verso sinistra/destra | CarouselView |
NavigationPage è l'approccio più comune e ogni pagina ha una Navigation proprietà che può essere usata per eseguire il push o il pop di pagine all'interno e all'esterno dello stack di navigazione. Questo è l'equivalente NavigationService più vicino a trovato in WPF.
Navigazione tramite URL
WPF è una tecnologia orientata al desktop e può accettare parametri della riga di comando per indirizzare il comportamento di avvio. Xamarin.Forms può usare collegamenti URL profondi per passare a una pagina all'avvio.