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
- iOS –
Main method > AppDelegate > App > ContentPage
- Android –
MainActivity > App > ContentPage
- UWP –
Main 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 GridSplitter
keine .
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 ResourceDictionary
Resources
-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 ResourceDictionary
nicht 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 BasedOn
und 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}" />