WPF versus životní cyklus aplikace Xamarin.Forms
Xamarin.Forms používá spoustu pokynů k návrhu z architektur založených na XAML, které byly před ním, zejména WPF. Jinými způsoby se ale výrazně liší, což může být rychlý bod pro lidi, kteří se pokoušejí migrovat. Tento dokument se pokusí identifikovat některé z těchto problémů a poskytnout pokyny, kde je to možné přemostit znalosti WPF na Xamarin.Forms.
Životní cyklus aplikace
Životní cyklus aplikace mezi WPF a Xamarin.Forms je podobný. Oba začínají v externím kódu (platformě) a spouští uživatelské rozhraní prostřednictvím volání metody. Rozdíl je v tom, že Xamarin.Forms vždy začíná v sestavení specifickém pro platformu, které pak inicializuje a vytvoří uživatelské rozhraní pro aplikaci.
WPF
Main method > App > MainWindow
Poznámka:
Metoda Main
je ve výchozím nastavení automaticky vygenerována a není viditelná v kódu.
Xamarin.Forms
- iOS –
Main method > AppDelegate > App > ContentPage
- Android –
MainActivity > App > ContentPage
- UPW –
Main method > App(UWP) > MainPage(UWP) > App > ContentPage
Třída aplikace
WPF i Xamarin.Forms mají Application
třídu, která se vytvoří jako singleton. Ve většině případů aplikace odvozují z této třídy, aby poskytovaly vlastní aplikaci, i když to není v WPF nezbytně nutné. Obě zpřístupňují vlastnost pro vyhledání vytvořeného Application.Current
singletonu.
Globální vlastnosti + trvalost
WPF i Xamarin.Forms mají Application.Properties
k dispozici slovník, ve kterém můžete ukládat globální objekty na úrovni aplikace, které jsou přístupné kdekoli v aplikaci. Hlavní rozdíl spočívá v tom, že Xamarin.Forms zachová všechny primitivní typy uložené v kolekci, když je aplikace pozastavená, a znovu je načte při opětovném spuštění. WPF toto chování automaticky nepodporuje – místo toho většina vývojářů spoléhala na izolované úložiště nebo využívala integrovanou Settings
podporu.
Definování stránek a vizuálního stromu
WPF používá Window
jako kořenový prvek pro jakýkoli vizuální prvek nejvyšší úrovně. Tím se definuje HWND ve světě Windows, aby se zobrazily informace. Ve WPF můžete vytvořit a zobrazit tolik oken současně, kolik chcete.
V Xamarin.Forms je vizuál nejvyšší úrovně vždy definovaný platformou , například v iOSu, je to .UIWindow
Xamarin.Forms vykreslí obsah do těchto nativních reprezentací platformy pomocí Page
třídy. Každý Page
v Xamarin.Forms představuje jedinečnou "stránku" v aplikaci, kde je vždy viditelný pouze jeden.
WpFs Window
i Xamarin.Forms Page
obsahují Title
vlastnost, která má vliv na zobrazený název, a obě mají Icon
vlastnost pro zobrazení konkrétní ikony stránky (Všimněte si , že název a ikona nejsou vždy viditelné v Xamarin.Forms). Kromě toho můžete změnit běžné vizuální vlastnosti na obou, jako je barva pozadí nebo obrázek.
Technicky možné vykreslit na dvě samostatná zobrazení platformy (např. definovat dva UIWindow
objekty a mít druhý vykreslený na externí displej nebo AirPlay) vyžaduje, aby to udělal kód specifický pro platformu a není přímo podporovanou funkcí samotného Xamarin.Forms.
Zobrazení
Hierarchie vizuálů pro obě architektury je podobná. WPF je trochu hlubší kvůli podpoře dokumentů WYSIWYG.
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
Zobrazit životní cyklus
Xamarin.Forms je primárně orientovaný na mobilní scénáře. Aplikace se proto aktivují, pozastaví a znovu aktivují, protože s nimi uživatel pracuje. Podobá se to kliknutí mimo Window
aplikaci WPF a existuje sada metod a odpovídajících událostí, které můžete přepsat nebo připojit k monitorování tohoto chování.
Účel | WPF – metoda | Xamarin.Forms – metoda |
---|---|---|
Počáteční aktivace | ctor + Window.OnLoaded | ctor + Page.OnStart |
Zobrazeny | Window.IsVisibleChanged | Page.Appearing |
Skrytý | Window.IsVisibleChanged | Page.Disappearing |
Pozastavení nebo ztráta fokusu | Window.OnDeactivated | Page.OnSleep |
Aktivované/získali fokus | Window.OnActivated | Page.OnResume |
Zavřeno | Window.OnClosing + Window.OnClosed | Není k dispozici |
Oba podporují skrytí nebo zobrazení podřízených ovládacích prvků i ve WPF, jedná se o vlastnost IsVisible
tri-state (viditelná, skrytá a sbalená). V Xamarin.Forms je jen viditelný nebo skrytý prostřednictvím IsVisible
vlastnosti.
Rozložení
Rozložení stránky se vyskytuje ve stejném 2 pass (Measure/Arrange), ke kterému dochází ve WPF. Rozložení stránky můžete připojit přepsáním následujících metod ve třídě Xamarin.Forms Page
:
Způsob | Účel |
---|---|
OnChildMeasureInvalidated | Upřednostňovaná velikost dítěte se změnila. |
OnSizeAllocated | Stránka má přiřazenou šířku nebo výšku. |
LayoutChanged – událost | Rozložení nebo velikost stránky se změnilo. |
Neexistuje žádná událost globálního rozložení, která se nazývá dnes, ani neexistuje globální CompositionTarget.Rendering
událost, jako je například wpf.
Běžné vlastnosti rozložení
WPF i Xamarin.Forms podporují Margin
ovládání mezer kolem elementu a Padding
pro řízení mezer uvnitř elementu. Kromě toho většina zobrazení rozložení Xamarin.Forms má vlastnosti pro řízení mezer (např. řádku nebo sloupce).
Většina prvků má navíc vlastnosti, které mají vliv na jejich umístění v nadřazené kontejneru:
WPF | Xamarin.Forms | Účel |
---|---|---|
Horizontalalignment | HorizontalOptions | Možnosti pro levý/střed/doprava/roztažení |
VerticalAlignment | VerticalOptions | Horní/ Střed/ Dole / Možnosti roztažení |
Poznámka:
Skutečná interpretace těchto vlastností závisí na nadřazené kontejneru.
Zobrazení rozložení
WPF i Xamarin.Forms používají ovládací prvky rozložení k umístění podřízených prvků. Ve většině případů jsou tyto funkce velmi blízko sebe.
WPF | Xamarin.Forms | Styl rozložení |
---|---|---|
StackPanel | StackLayout | Nekonečná skládání zleva doprava nebo shora dolů |
Mřížka | Mřížka | Tabulkový formát (řádky a sloupce) |
DockPanel | Není k dispozici | Ukotvení k okrajům okna |
Aplikace plátna | AbsoluteLayout | Umístění pixelů/souřadnic |
WrapPanel | Není k dispozici | Zabalení zásobníku |
Není k dispozici | RelativeLayout | Relativní umístění založené na pravidlech |
Poznámka:
Xamarin.Forms nepodporuje .GridSplitter
Obě platformy používají připojené vlastnosti k vyladění podřízených položek .
Vykreslování
Mechanismus vykreslování pro WPF a Xamarin.Forms se výrazně liší. Ve WPF ovládací prvky, které vytvoříte, přímo vykreslují obsah na pixely na obrazovce. WPF udržuje dva objektové grafy (stromy), které představují toto – logický strom představuje ovládací prvky definované v kódu nebo XAML a vizuální strom představuje skutečné vykreslení, které se provádí buď přímo vizuálním prvkem (prostřednictvím metody virtuálního kreslení), nebo prostřednictvím definovaného ControlTemplate
XAML, který lze nahradit nebo přizpůsobit. Vizuální strom je obvykle složitější, protože zahrnuje věci, jako jsou ohraničení kolem ovládacích prvků, popisky implicitního obsahu atd. WPF obsahuje sadu rozhraní API (LogicalTreeHelper
a VisualTreeHelper
) pro zkoumání těchto dvou grafů objektů.
V Xamarin.Forms jsou ovládací prvky, které definujete v objektu, Page
opravdu jednoduché datové objekty. Podobají se reprezentaci logického stromu, ale nikdy nevykreslují obsah sami. Místo toho jsou datovým modelem , který ovlivňuje vykreslování prvků. Skutečné vykreslování provádí samostatná sada vizuálních rendererů, které jsou namapovány na každý typ ovládacího prvku. Tyto vykreslovací moduly jsou zaregistrované v každém projektu specifickém pro platformu sestaveními Xamarin.Forms. Tady si můžete prohlédnout seznam. Kromě nahrazení nebo rozšíření rendereru má Xamarin.Forms také podporu efektů , které lze použít k ovlivnění nativního vykreslování na základě jednotlivých platforem.
Logický/vizuální strom
K procházení logického stromu v Xamarin.Forms neexistuje žádné vystavené rozhraní API– k získání stejných informací ale můžete použít Reflexe ion. Tady je například metoda, která může vytvořit výčet logických podřízených položek reflexí.
Grafika
Xamarin.Forms obsahuje grafický systém pro kreslicí primitivy, který se nazývá Obrazce. Další informace o obrazci naleznete v tématu Obrazce Xamarin.Forms. Kromě toho můžete zahrnout knihovny třetích stran, jako je SkiaSharp , abyste získali víceplatformní 2D výkres.
Zdroje informací
WPF i Xamarin.Forms mají koncept prostředků i slovníků prostředků. Libovolný typ objektu ResourceDictionary
můžete umístit do klíče a pak ho {StaticResource}
vyhledat podle věcí, které se nezmění, nebo {DynamicResource}
pro věci, které se můžou změnit ve slovníku za běhu. Použití a mechanika jsou stejné s jedním rozdílem: Xamarin.Forms vyžaduje, abyste definovali ResourceDictionary
přiřazení vlastnosti Resources
, zatímco WPF ho předem vytvoří a přiřadí ho za vás.
Podívejte se například na následující definici:
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>
Pokud nedefinujete ResourceDictionary
, vygeneruje se chyba za běhu.
Styly
Styly jsou také plně podporovány v Xamarin.Forms a lze je použít k motivu elementů Xamarin.Forms, které tvoří uživatelské rozhraní. Podporují triggery (vlastnost, událost a data), dědičnost prostřednictvím BasedOn
a vyhledávání prostředků pro hodnoty. Styly se použijí na elementy buď explicitně prostřednictvím Style
vlastnosti, nebo implicitně tím, že nezadáte klíč prostředku – stejně jako WPF.
Styly zařízení
WPF má sadu předdefinovaných vlastností (uložených jako statické hodnoty v sadě statických tříd, například SystemColors
), které určují systémové barvy, písma a metriky ve formě hodnot a klíčů prostředků. Xamarin.Forms je podobný, ale definuje sadu stylů zařízení, aby představovaly stejné věci. Tyto styly jsou poskytovány architekturou a nastaveny na hodnoty na základě prostředí runtime (např. přístupnost).
WPF
<Label Text="Title" Foreground="{DynamicResource {x:Static SystemColors.DesktopBrushKey}}" />
Xamarin.Forms
<Label Text="Title" Style="{DynamicResource TitleStyle}" />