WPF vs. Xamarin.Forms: Ähnlichkeiten und Unterschiede
Steuerelementvorlagen
WPF unterstützt das Konzept von Steuerelementvorlagen , die die Visualisierungsanweisungen für ein Steuerelement (Button
, ListBox
usw.) bereitstellen. Wie bereits erwähnt, verwendet Xamarin.Forms konkrete Renderingklassen für diese, die mit der nativen Plattform (iOS, Android usw.) interagieren, um das Steuerelement zu visualisieren.
Xamarin.Forms hat jedoch einen ControlTemplate
Typ – es wird für Designobjekte Page
verwendet. Sie bietet eine Definition für einen Page
einheitlichen Inhalt, ermöglicht es dem Benutzer der Seite jedoch, Farben, Schriftarten usw. zu ändern und sogar Elemente hinzuzufügen, um sie für die Anwendung eindeutig zu machen.
Allgemeine Verwendungen hierfür sind z. B. Authentifizierungsdialoge, Eingabeaufforderungen und bereitstellen ein standardisiertes, aber designfähiges Seitenerscheinungsbild, das in der App angepasst werden kann. Im Rahmen dieser Unterstützung werden viele vertraute WPF-benannte Steuerelemente verwendet:
ContentPage
ContentView
ContentPresenter
TemplateBinding
Aber es ist wichtig zu wissen, dass diese nicht denselben Zweck in Xamarin.Forms erfüllen. Weitere Informationen zu diesem Feature finden Sie auf der Dokumentationsseite.
XAML
XAML wird als deklarative Markupsprache für WPF und Xamarin.Forms verwendet. Die Syntax ist größtenteils identisch – der Hauptunterschied sind die Objekte, die von den XAML-Diagrammen definiert/erstellt werden.
Xamarin.Forms unterstützt die XAML 2009-Spezifikation. Dies erleichtert das Definieren von Daten wie
string
s,int
s usw. sowie das Definieren generischer Typen und Übergeben von Argumenten an Konstruktoren.Es gibt derzeit keine Möglichkeit, XAML wie WPF
XamlReader
dynamisch zu laden. Sie können jedoch die gleichen grundlegenden Funktionen mit einem NuGet-Paket erhalten.
Markuperweiterungen
Xamarin.Forms unterstützt das Erweitern von XAML über Markuperweiterungen, ähnlich wie WPF. Aus der Box besteht aus den gleichen grundlegenden Bausteinen:
{x:Array}
{Binding}
{DynamicResource}
{x:Null}
{x:Static}
{StaticResource}
{x:Type}
Darüber hinaus enthält {x:Reference}
sie die XAML 2009-Spezifikation und eine {TemplateBinding}
Markuperweiterung, die für die spezielle Version von ControlTemplate
Xamarin.Forms verwendet wird.
Warnung
Die ControlTemplate
Unterstützung ist nicht identisch – obwohl sie denselben Namen hat.
Xamarin.Forms unterstützt auch benutzerdefinierte Markuperweiterungen – die Implementierung unterscheidet sich jedoch geringfügig. In WPF müssen Sie von MarkupExtension
einer abstrakten Basisklasse abgeleitet werden. In Xamarin.Forms wird das durch eine Schnittstelle IMarkupExtension
ersetzt oder IMarkupExtension<T>
flexibler.
Genau wie WPF ist die einzelne erforderliche Methode eine ProvideValue
Methode, um den Wert aus der Markuperweiterung zurückzugeben.
Bindungsinfrastruktur
Eines der zentralen Konzepte, die übertragen werden, ist eine Datenbindungsinfrastruktur, um visuelle Eigenschaften mit .NET-Dateneigenschaften zu verbinden. Dies ermöglicht Architekturmuster wie MVVM. Das grundlegende Design ist identisch – Sie verfügen über eine bindbare Basisklasse BindableObject, in WPF ist dies die DependencyObject-Klasse . Diese Basisklasse wird als Stamm-Vorgänger für alle Objekte verwendet, die als Ziele an der Datenbindung teilnehmen. Die abgeleiteten Klassen machen dann BindableProperty-Objekte verfügbar, die als Sicherungsspeicher für Eigenschaftswerte fungieren (diese werden als DependencyProperty-Objekte in WPF definiert).
Definieren von bindbaren Eigenschaften
Die Definition für eine bindbare Eigenschaft in Xamarin.Forms ist identisch mit WPF:
- Das Objekt muss von
BindableObject
. - Es muss ein öffentliches statisches Feld vom Typ
BindableProperty
deklariert sein, um den Sicherungsspeicherschlüssel für die Eigenschaft zu definieren. - Es sollte ein Öffentlicher Instanz-Eigenschaftswrapper vorhanden sein, der den Eigenschaftenwert verwendet
GetValue
undSetValue
abrufen und ändern kann.
Ein vollständiges Beispiel finden Sie unter Bindable Properties in Xamarin.Forms.
Angefügte Eigenschaften
Angefügte Eigenschaften sind eine Teilmenge der bindungsfähigen Eigenschaft und funktionieren auf die gleiche Weise wie in WPF. Der Hauptunterschied besteht darin, dass der Eigenschaftenwrapper in diesem Fall weggelassen wird und durch eine Reihe statischer Get/Set-Methoden für die eigene Klasse ersetzt wird. Weitere Informationen finden Sie unter "Angefügte Eigenschaften" in Xamarin.Forms .
Verwenden des Bindungsmoduls
Der Prozess für die Verwendung des Bindungsmoduls ist identisch mit der Verwendung in WPF. Sie kann im CodeBehind verwendet werden, indem ein Objekt erstellt wird, das Binding
an ein Quellobjekt (beliebiger .NET-Typ) und einen optionalen Eigenschaftswert gebunden ist (wenn es ausgelassen wird, behandelt es das Quellobjekt als die Eigenschaft selbst – genau wie WPF). Anschließend können SetBinding
Sie eine beliebige BindableObject
Bindung einer BindableProperty
Bindung zuordnen.
Alternativ können Sie die Bindungsbeziehung in XAML mithilfe der BindingExtension
. Sie weist die gleichen Grundlegendenwerte wie die Erweiterung in WPF auf.
Die Bindungsunterstützung und das Modul ähneln der Silverlight-Implementierung mehr als WPF. Es gibt mehrere fehlende Features, die in Xamarin.Forms nicht implementiert wurden:
- Es gibt keine Unterstützung für die folgenden Features in Bindungen:
- BindingGroupName
- BindsDirectlyToSource
- IsAsync
- MultiBinding
- NotifyOnSourceUpdated
- NotifyOnTargetUpdated
- NotifyOnValidationError
- UpdateSourceTrigger
- UpdateSourceExceptionFilter
- ValidatesOnDataErrors
- ValidatesOnExceptions
- ValidationRules-Auflistung
- XPath
- XmlNamespaceManager
RelativeSource
Es gibt keine Unterstützung für RelativeSource
Bindungen. In WPF können Sie eine Bindung an andere visuelle Elemente, die in XAML definiert sind, zulassen. In Xamarin.Forms kann diese Funktion mithilfe der {x:Reference}
Markuperweiterung erreicht werden. Angenommen, wir haben ein Steuerelement mit dem Namen "otherControl", das eine Text-Eigenschaft enthält, können wir wie folgt an das Steuerelement binden:
WPF
Text={Binding RelativeSource={RelativeSource otherControl}, Path=Text}
Xamarin.Forms
Text={Binding Source={x:Reference otherControl}, Path=Text}
Die gleiche Funktion kann für das {RelativeSource Self}
Feature verwendet werden. Es gibt jedoch keine Unterstützung für das Auffinden von Vorgängern nach Typ ({RelativeSource FindAncestor}
).
Bindungskontext
In WPF können Sie einen DataContext
Eigenschaftswert definieren, der die Standardbindungsquelle zurückgibt. Wenn die Quelle für eine Bindung nicht definiert ist, wird dieser Eigenschaftswert verwendet. Der Wert wird von der visuellen Struktur geerbt, sodass er auf einer höheren Ebene definiert und dann von untergeordneten Elementen verwendet wird.
In Xamarin.Forms ist dieses Feature verfügbar, aber der Eigenschaftsname ist BindingContext
.
Wertkonverter
Wertkonverter werden in Xamarin.Forms vollständig unterstützt – genau wie WPF. Das gleiche Schnittstellen-Shape wird verwendet, aber Xamarin.Forms hat die Schnittstelle im Xamarin.Forms
Namespace definiert.
Model View ViewModel
MVVM wird sowohl von WPF als auch von Xamarin.Forms vollständig unterstützt.
WPF enthält einen integrierten, in RoutedCommand
dem manchmal verwendet wird; Xamarin.Forms verfügt über keine integrierte Befehlsunterstützung über die ICommand
Schnittstellendefinition hinaus. Sie können eine Vielzahl von MVVM-Frameworks hinzufügen, um die erforderlichen Basisklassen zum Implementieren von MVVM hinzuzufügen.
INotifyPropertyChanged und INotifyCollectionChanged
Beide Schnittstellen werden in Xamarin.Forms-Bindungen vollständig unterstützt. Im Gegensatz zu vielen XAML-basierten Frameworks können Eigenschaftsänderungsbenachrichtigungen in Hintergrundthreads in Xamarin.Forms (genau wie WPF) ausgelöst werden, und das Bindungsmodul wechselt ordnungsgemäß zum UI-Thread.
Darüber hinaus unterstützen SynchronizationContext
beide Umgebungen und async
/await
führen eine ordnungsgemäße Thread-Marshalling-Ausführung durch. WPF enthält die Dispatcher
Klasse für alle visuellen Elemente, Xamarin.Forms verfügt über eine statische Methode Device.BeginInvokeOnMainThread
, die auch verwendet werden kann (obwohl SynchronizationContext
sie für plattformübergreifende Codierung bevorzugt wird).
- Xamarin.Forms enthält eine
ObservableCollection<T>
Sammlungsänderungsbenachrichtigungen. - Sie können verwenden
BindingBase.EnableCollectionSynchronization
, um threadübergreifende Updates für eine Sammlung zu aktivieren. Die API unterscheidet sich geringfügig von der WPF-Variation, überprüfen Sie die Dokumente auf Verwendungsdetails.
Datenvorlagen
Datenvorlagen werden in Xamarin.Forms unterstützt, um das Rendering einer ListView
Zeile (Zelle) anzupassen. Im Gegensatz zu WPF, das s für ein inhaltsorientiertes Steuerelement verwenden DataTemplate
kann, verwendet Xamarin.Forms derzeit nur diese für ListView
. Die Vorlagendefinition kann inline (der ItemTemplate
Eigenschaft zugewiesen) oder als Ressource in einer ResourceDictionary
.
Darüber hinaus sind sie nicht ganz so flexibel wie ihr WPF-Gegenstück.
- Das Stammelement des Objekts
DataTemplate
muss immer einViewCell
Objekt sein. - Datentrigger werden in einer Datenvorlage vollständig unterstützt, müssen jedoch eine
DataType
Eigenschaft enthalten, die den Typ der Eigenschaft angibt, der der Trigger zugeordnet ist. DataTemplateSelector
wird auch unterstützt, leitet sie aber abDataTemplate
und wird daher direkt derItemTemplate
Eigenschaft (vs.ItemTemplateSelector
in WPF) zugewiesen.
ItemsControl
Es gibt keine integrierte Entsprechung zu einer ItemsControl
in Xamarin.Forms, aber es gibt hier eine benutzerdefinierte für Xamarin.Forms.
Benutzersteuerelemente
In WPF werden s verwendet, UserControl
um einen Abschnitt der Benutzeroberfläche bereitzustellen, der ein entsprechendes Verhalten aufweist. In Xamarin.Forms verwenden wir denselben ContentView
Zweck. Sowohl die Bindung als auch die Aufnahme in XAML unterstützen.
Navigation
WPF enthält eine selten verwendete Funktion NavigationService
, die verwendet werden kann, um ein "browserähnliches" Navigationsfeature bereitzustellen. Die meisten Apps haben dies jedoch nicht gestört und stattdessen verschiedene Window
Elemente oder verschiedene Abschnitte des Fensters verwendet, um Daten anzuzeigen.
Auf Telefongeräten sind unterschiedliche Bildschirme häufig die Lösung, sodass Xamarin.Forms Unterstützung für mehrere Formen der Navigation umfasst:
Navigationsformat | Seitentyp |
---|---|
Stapelbasiert (Push/Pop) | NavigationPage |
Master/Detail | MasterDetailPage |
Registerkarten | TabbedPage |
Wischen Sie nach links/rechts | CarouselView |
Dies NavigationPage
ist der am häufigsten verwendete Ansatz, und jede Seite verfügt über eine Navigation
Eigenschaft, die verwendet werden kann, um Seiten auf und aus dem Navigationsstapel zu verschieben oder zu deaktivieren. Dies entspricht dem in WPF am ehesten NavigationService
gefundenen.
URL-Navigation
WPF ist eine desktoporientierte Technologie und kann Befehlszeilenparameter für das direkte Startverhalten akzeptieren. Xamarin.Forms kann deep URL-Verknüpfungen verwenden, um zu einer Seite beim Start zu springen.