WPF vs. Xamarin.Forms: Ähnlichkeiten und Unterschiede

Steuerelementvorlagen

WPF unterstützt das Konzept von Steuerelementvorlagen , die die Visualisierungsanweisungen für ein Steuerelement (Button, ListBoxusw.) bereitstellen. Wie oben Erwähnung, 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:

  1. ContentPage
  2. ContentView
  3. ContentPresenter
  4. 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 strings, ints usw. sowie das Definieren generischer Typen und Übergeben von Argumenten an Konstruktoren.

  • Es gibt derzeit keine Möglichkeit, XAML wie WPF XamlReaderdynamisch 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:

  1. {x:Array}
  2. {Binding}
  3. {DynamicResource}
  4. {x:Null}
  5. {x:Static}
  6. {StaticResource}
  7. {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:

  1. Das Objekt muss von BindableObject.
  2. Es muss ein öffentliches statisches Feld vom Typ BindableProperty deklariert sein, um den Sicherungsspeicherschlüssel für die Eigenschaft zu definieren.
  3. Es sollte ein Öffentlicher Instanz-Eigenschaftswrapper vorhanden sein, der den Eigenschaftenwert verwendet GetValue und SetValue 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 BindablePropertyBindung 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 DataTemplatekann, 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.

  1. Das Stammelement des Objekts DataTemplate muss immer ein ViewCell Objekt sein.
  2. 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.
  3. DataTemplateSelector wird auch unterstützt, leitet sie aber ab DataTemplate und wird daher direkt der ItemTemplate 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, UserControlum 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.

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
Tabstoppzeichen 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.