WPF im Vergleich zum Xamarin.Forms-App-Lebenszyklus

Xamarin.Forms übernimmt viele Entwurfsanweisungen aus den XAML-basierten Frameworks, die zuvor verfügbar waren, insbesondere WPF. Auf andere Weise weicht es jedoch erheblich ab, was ein Knackpunkt für Personen sein kann, die versuchen, zu migrieren. In diesem Dokument wird versucht, einige dieser Probleme zu identifizieren und nach Möglichkeit Anleitungen zum Überbrücken von WPF-Wissen mit Xamarin.Forms bereitzustellen.

App-Lebenszyklus

Der Anwendungslebenszyklus zwischen WPF und Xamarin.Forms ist ähnlich. Beide beginnen im externen (Plattform-)Code und starten die Benutzeroberfläche über einen Methodenaufruf. Der Unterschied besteht darin, dass Xamarin.Forms immer in einer plattformspezifischen Assembly beginnt, die dann die Benutzeroberfläche für die App initialisiert und erstellt.

WPF

  • Main method > App > MainWindow

Hinweis

Die Main Methode wird standardmäßig automatisch generiert und im Code nicht sichtbar.

Xamarin.Forms

  • iOSMain method > AppDelegate > App > ContentPage
  • AndroidMainActivity > App > ContentPage
  • UWPMain method > App(UWP) > MainPage(UWP) > App > ContentPage

Anwendungsklasse

Sowohl WPF als auch Xamarin.Forms verfügen über eine Application Klasse, die als Singleton erstellt wird. In den meisten Fällen leiten Apps von dieser Klasse ab, um eine benutzerdefinierte Anwendung bereitzustellen, obwohl dies in WPF nicht unbedingt erforderlich ist. Beide machen eine Application.Current Eigenschaft verfügbar, um das erstellte Singleton zu suchen.

Globale Eigenschaften + Persistenz

Sowohl WPF als auch Xamarin.Forms verfügen über ein Application.Properties Wörterbuch, in dem Sie globale Objekte auf App-Ebene speichern können, auf die überall in der Anwendung zugegriffen werden kann. Der Hauptunterschied besteht darin, dass Xamarin.Forms alle primitiven Typen beibehalten , die in der Sammlung gespeichert sind, wenn die App angehalten wird, und sie beim Neustart erneut lädt. WPF unterstützt dieses Verhalten nicht automatisch. Stattdessen haben sich die meisten Entwickler auf isolierten Speicher verlassen oder die integrierte Settings Unterstützung verwendet.

Definieren von Seiten und der visuellen Struktur

WPF verwendet das Window als Stammelement für alle visuellen Elemente der obersten Ebene. Dadurch wird ein HWND in der Windows-Welt definiert, um Informationen anzuzeigen. Sie können in WPF beliebig viele Fenster gleichzeitig erstellen und anzeigen.

In Xamarin.Forms wird das Visual der obersten Ebene immer von der Plattform definiert, z. B. unter iOS ist es ein UIWindow. Xamarin.Forms rendert den Inhalt in diesen nativen Plattformdarstellungen mithilfe einer Page -Klasse. Jede Page in Xamarin.Forms stellt eine eindeutige "Seite" in der Anwendung dar, wobei jeweils nur eine seite sichtbar ist.

Sowohl WPFs Window als auch Xamarin.Forms Page enthalten eine Title Eigenschaft, um den angezeigten Titel zu beeinflussen, und beide verfügen über eine Icon Eigenschaft, um ein bestimmtes Symbol für die Seite anzuzeigen (Beachten Sie , dass Titel und Symbol in Xamarin.Forms nicht immer sichtbar sind). Darüber hinaus können Sie allgemeine visuelle Eigenschaften für beide ändern, z. B. die Hintergrundfarbe oder das Bild.

Es ist technisch möglich, zwei separate Plattformsichten zu rendern (z. B. zwei UIWindow Objekte zu definieren und das zweite auf einem externen Display oder AirPlay zu rendern), dazu erfordert es plattformspezifischen Code und ist kein direkt unterstütztes Feature von Xamarin.Forms selbst.

Ansichten

Die visuelle Hierarchie für beide Frameworks ist ähnlich. WPF ist aufgrund der Unterstützung für WYSIWYG-Dokumente etwas tiefer.

WPF

DependencyObject - base class for all bindable things
   Visual - rendering mechanics
      UIElement - common events + interactions
         FrameworkElement - adds layout
            Shape - 2D graphics
            Control - interactive controls

Xamarin.Forms

BindableObject - base class for all bindable things
   Element - basic parent/child support + resources + effects
      VisualElement - adds visual rendering properties (color, fonts, transforms, etc.)
         View - layout + gesture support

Ansichtslebenszyklus

Xamarin.Forms ist in erster Linie auf mobile Szenarien ausgerichtet. Daher werden Anwendungen aktiviert, angehalten und reaktiviert , wenn der Benutzer mit ihnen interagiert. Dies ähnelt dem Wegklicken von in Window einer WPF-Anwendung, und es gibt eine Reihe von Methoden und entsprechenden Ereignissen, die Sie überschreiben oder einbinden können, um dieses Verhalten zu überwachen.

Zweck WPF-Methode Xamarin.Forms-Methode
Erstaktivierung ctor + Window.OnLoaded ctor + Page.OnStart
Angezeigt Window.IsVisibleChanged Page.Appearing
Ausgeblendet Window.IsVisibleChanged Page.Disappearing
Angehalten/Fokus verloren Window.OnDeactivated Page.OnSleep
Aktiviert/Fokus erhalten Window.OnActivated Page.OnResume
Geschlossen Window.OnClosing + Window.OnClosed

Beide unterstützen das Ausblenden/Anzeigen untergeordneter Steuerelemente. In WPF handelt es sich um eine Drei-Zustandseigenschaft IsVisible (sichtbar, ausgeblendet und reduziert). In Xamarin.Forms ist es nur sichtbar oder ausgeblendet durch die IsVisible -Eigenschaft.

Layout

Das Seitenlayout erfolgt im gleichen 2-Pass (Measure/Arrange) wie in WPF. Sie können in das Seitenlayout eingebunden werden, indem Sie die folgenden Methoden in der Xamarin.Forms-Klasse Page überschreiben:

Methode Zweck
OnChildMeasureInvalidated Die bevorzugte Größe eines untergeordneten Elements wurde geändert.
OnSizeAllocated Der Seite wurde eine Breite/Höhe zugewiesen.
LayoutChanged-Ereignis Layout/Größe der Seite wurde geändert.

Es gibt kein globales Layoutereignis, das heute genannt wird, noch gibt es ein globales CompositionTarget.Rendering Ereignis wie in WPF.

Allgemeine Layouteigenschaften

WPF und Xamarin.Forms unterstützen Margin beide das Steuern des Abstands um ein Element und Padding das Steuern des Abstands innerhalb eines Elements. Darüber hinaus verfügen die meisten Xamarin.Forms-Layoutansichten über Eigenschaften zum Steuern des Abstands (z. B. Zeile oder Spalte).

Darüber hinaus verfügen die meisten Elemente über Eigenschaften, um die Position im übergeordneten Container zu beeinflussen:

WPF Xamarin.Forms Zweck
Horizontalalignment HorizontalOptions Optionen "Links/Mitte/Rechts"/"Stretch"
Verticalalignment VerticalOptions Top/Center/Bottom/Stretch-Optionen

Hinweis

Die tatsächliche Interpretation dieser Eigenschaften hängt vom übergeordneten Container ab.

Layoutansichten

WPF und Xamarin.Forms verwenden layoutsteuerelemente, um untergeordnete Elemente zu positionieren. In den meisten Fällen liegen diese in Bezug auf die Funktionalität sehr nahe beieinander.

WPF Xamarin.Forms Layoutstil
StackPanel StackLayout Von links nach rechts oder von oben nach unten unendlich stapeln
Raster Raster Tabellarisches Format (Zeilen und Spalten)
DockPanel Andocken an Fensterrändern
Canvas AbsoluteLayout Pixel-/Koordinatenpositionierung
WrapPanel Umbruchstapel
RelativeLayout Relative regelbasierte Positionierung

Hinweis

Xamarin.Forms unterstützt GridSplitterkeine .

Beide Plattformen verwenden angefügte Eigenschaften , um untergeordnete Elemente zu optimieren.

Darstellung

Die Renderingmechanismen für WPF und Xamarin.Forms unterscheiden sich grundlegend. In WPF rendern die von Ihnen erstellten Steuerelemente Inhalte direkt in Pixeln auf dem Bildschirm. WPF verwaltet zwei Objektdiagramme (Trees), um dies darzustellen: Die logische Struktur stellt die Steuerelemente wie in Code oder XAML definiert dar, und die visuelle Struktur stellt das tatsächliche Rendering auf dem Bildschirm dar, das entweder direkt vom visuellen Element (über eine virtuelle Zeichnungsmethode) oder über eine XAML-Definierte ControlTemplate ausgeführt wird, die ersetzt oder angepasst werden kann. In der Regel ist die visuelle Struktur komplexer, da sie Elemente wie Rahmen um Steuerelemente, Bezeichnungen für impliziten Inhalt usw. enthält. WPF enthält eine Reihe von APIs (LogicalTreeHelper und VisualTreeHelper), um diese beiden Objektdiagramme zu untersuchen.

In Xamarin.Forms sind die Steuerelemente, die Sie in einem Page definieren, nur einfache Datenobjekte. Sie ähneln der Darstellung der logischen Struktur, rendern inhalte jedoch nie selbst. Stattdessen sind sie das Datenmodell , das das Rendern von Elementen beeinflusst. Das tatsächliche Rendern erfolgt durch einen separaten Satz visueller Renderer , die jedem Steuerelementtyp zugeordnet sind. Diese Renderer werden in jedem der plattformspezifischen Projekte von plattformspezifischen Xamarin.Forms-Assemblys registriert. Eine Liste finden Sie hier. Zusätzlich zum Ersetzen oder Erweitern des Renderers unterstützt Xamarin.Forms auch Effekte , die verwendet werden können, um das native Rendering plattformbezogen zu beeinflussen.

Logische/visuelle Struktur

Es gibt keine verfügbar gemachte API, um die logische Struktur in Xamarin.Forms zu durchlaufen. Sie können jedoch Reflektion verwenden, um dieselben Informationen abzurufen. Hier ist z. B . eine Methode, die logische untergeordnete Elemente mit Reflektion auflisten kann.

Grafiken

Xamarin.Forms enthält ein Grafiksystem zum Zeichnen von Grundtypen, das als Shapes bezeichnet wird. Weitere Informationen zu Shapes finden Sie unter Xamarin.Forms Shapes. Darüber hinaus können Sie Drittanbieterbibliotheken wie SkiaSharp einschließen, um plattformübergreifende 2D-Zeichnung zu erhalten.

Ressourcen

WPF und Xamarin.Forms haben beide das Konzept von Ressourcen und Ressourcenwörterbüchern. Sie können jeden Objekttyp mit einem Schlüssel in einem ResourceDictionary platzieren und dann nach {StaticResource} Dingen suchen, die sich nicht ändern, oder {DynamicResource} nach Dingen, die sich zur Laufzeit im Wörterbuch ändern können. Die Verwendung und die Mechanik sind mit einem Unterschied identisch: Xamarin.Forms erfordert, dass Sie definieren, um der ResourceDictionaryResources -Eigenschaft zuzuweisen, während WPF eine vorab erstellt und Ihnen zuweist.

Sehen Sie sich z. B. die folgende Definition an:

WPF

<Window.Resources>
   <Color x:Key="redColor">#ff0000</Color>
   ...
</Window.Resources>

Xamarin.Forms

<ContentPage.Resources>
   <ResourceDictionary>
      <Color x:Key="redColor">#ff0000</Color>
      ...
   </ResourceDictionary>
</ContentPage.Resources>

Wenn Sie den ResourceDictionarynicht definieren, wird ein Laufzeitfehler generiert.

Stile

Stile werden auch in Xamarin.Forms vollständig unterstützt und können zum Design der Xamarin.Forms-Elemente verwendet werden, aus denen die Benutzeroberfläche besteht. Sie unterstützen Trigger (Eigenschaft, Ereignis und Daten), Vererbung über BasedOnund Ressourcensuche für Werte. Stile werden entweder explizit über die Style -Eigenschaft oder implizit auf Elemente angewendet, indem kein Ressourcenschlüssel angegeben wird – genau wie WPF.

Gerätestile

WPF verfügt über einen Satz vordefinierter Eigenschaften (die als statische Werte in einer Reihe statischer Klassen wie SystemColors) gespeichert werden, die Systemfarben, Schriftarten und Metriken in Form von Werten und Ressourcenschlüsseln diktieren. Xamarin.Forms ist ähnlich, definiert jedoch eine Reihe von Gerätestilen , um die gleichen Dinge darzustellen. Diese Stile werden vom Framework bereitgestellt und auf Werte basierend auf der Laufzeitumgebung (z. B. Barrierefreiheit) festgelegt.

WPF

<Label Text="Title" Foreground="{DynamicResource {x:Static SystemColors.DesktopBrushKey}}" />

Xamarin.Forms

<Label Text="Title" Style="{DynamicResource TitleStyle}" />