Životní cyklus aplikace WPF vs. Xamarin.Forms
Xamarin.Forms využívá spoustu pokynů k návrhu z architektur založených na XAML, které předcházely, zejména WPF. Jinými způsoby se ale výrazně liší, což může být pro lidi, kteří se pokoušejí migrovat, zálepšující bod. Tento dokument se pokusí identifikovat některé z těchto problémů a poskytnout pokyny, kde je to možné pro přemostění znalostí 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 se vždy spouští 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 –
- Android –
- UPW –
Třída aplikace
WPF i Xamarin.Forms mají třídu Application , která je vytvořena jako jedna třída. Ve většině případů se aplikace odvozují z této třídy, aby poskytovaly vlastní aplikaci, i když to není ve WPF nezbytně nutné. Obě zpřístupňuje Application.Current vlastnost pro vyhledání vytvořené singleton.
Globální vlastnosti a trvalost
WPF i Xamarin.Forms mají slovník, ve kterém můžete ukládat globální objekty na úrovni aplikace, které jsou přístupné Application.Properties kdekoli v aplikaci. Hlavní rozdíl je v tom, že Xamarin.Forms zachová všechny primitivní typy uložené v kolekci, když je aplikace pozastavená, a při opětovném spuštění je znovu načtou. WPF toto chování automaticky nepodporuje – většina vývojářů místo toho spoléhá na izolované úložiště nebo využívá integrovanou Settings podporu.
Definování stránek a vizuálního stromu
WPF používá Window jako kořenový prvek pro libovolný prvek vizuálu nejvyšší úrovně. Tím se definuje HWND v Windows světě pro zobrazení informací. 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 najednou viditelná jenom jedna stránka.
Soubory WPF i Xamarin.Forms obsahují vlastnost, která má vliv na zobrazený název, a obě mají vlastnost pro zobrazení konkrétní ikony stránky ( Všimněte si, že název a ikona nejsou vždy viditelné v WindowPageTitleIcon Xamarin.Forms).Window Kromě toho můžete změnit společné vlastnosti vizuálu u obou, jako je barva pozadí nebo obrázek.
Technicky je možné vykreslit do dvou samostatných zobrazení platformy (např. definovat dva objekty a druhý objekt vykreslit na externí zobrazení nebo AirPlay), vyžaduje to kód specifický pro platformu a není to přímo podporovaná funkce samotného UIWindow Xamarin.Forms.
Zobrazení
Hierarchie vizuálů pro obě architektury je podobná. WPF je o něco hlubší díky 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 se primárně zaměřuje na mobilní scénáře. Aplikace se tak aktivují,pozastavía znovu aktivují, když s nimi uživatel pracuje. To se podobá kliknutí mimo v aplikaci WPF a existuje sada metod a odpovídajících událostí, které můžete přepsat nebo připojit k Window 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.On V spánku |
| Aktivováno / Mám fokus | Window.OnActivated | Page.OnResume |
| Uzavřeno | Window.OnClosing + Window.OnClosed | Není k dispozici |
Obě podporují skrytí/zobrazení podřízených ovládacích prvků, ve WPF se jedná o vlastnost tri-state IsVisible (viditelná, skrytá a sbalená). V Xamarin.Forms je jenom viditelný nebo skrytý prostřednictvím IsVisible vlastnosti .
Layout
Rozložení stránky probíhá ve stejném 2 průchodu (míra/uspořádání), 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ě Page Xamarin.Forms:
| Metoda | Účel |
|---|---|
| OnChildMeasureInvalidated | Upřednostňovaná velikost podřízeného souboru se změnila. |
| OnSizeAllocated | Stránce byla přiřazena šířka/výška. |
| Událost LayoutChanged | Změnilo se rozložení a velikost stránky. |
Neexistuje žádná událost globálního rozložení, která se dnes volá, ani neexistuje globální událost jako CompositionTarget.Rendering ve WPF.
Běžné vlastnosti rozložení
WPF i Xamarin.Forms podporují řízení mezer kolem elementu a ovládání mezer MarginPaddingMargin elementu. Kromě toho má většina zobrazení rozložení Xamarin.Forms vlastnosti pro ovládání mezer (např. řádku nebo sloupce).
Kromě toho má většina prvků vlastnosti, které mají vliv na jejich umístění v nadřazeném kontejneru:
| WPF | Xamarin.Forms | Účel |
|---|---|---|
| Horizontalalignment | Horizontálnímožnosti | Možnosti vlevo/na střed/vpravo/roztažení |
| Svislé zarovnání | SvisléMožnosti | Možnosti horní/střed/dole/roztažení |
Poznámka
Skutečná interpretace těchto vlastností závisí na nadřazeném kontejneru.
Zobrazení rozložení
WPF i Xamarin.Forms používají ovládací prvky rozložení k umístění podřízených elementů. Ve většině případů jsou velmi blízko sebe z hlediska funkčnosti.
| 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 |
| Plátno | AbsoluteLayout | Umístění pixelů/souřadnic |
| WrapPanel | Není k dispozici | Zabalení zásobníku |
| Není k dispozici | RelativeLayout | Relativní umístění na základě pravidel |
Poznámka
Xamarin.Forms nepodporuje GridSplitter .
Obě platformy používají připojené vlastnosti k vyladění dětí.
Vykreslování
Mechanismy vykreslování pro WPF a Xamarin.Forms se výrazně liší. Ve WPF ovládací prvky, které vytvoříte přímo, vykreslují obsah do pixelů na obrazovce. WPF udržuje dva objektové grafy(stromy ), které to reprezentují – logický strom představuje ovládací prvky definované v kódu nebo XAML a vizuální strom představuje skutečné vykreslování, ke kterému dochází na obrazovce, které se provádí buď přímo vizuálním prvkem (prostřednictvím virtuální metody draw), nebo prostřednictvím definovaného XAML, které lze nahradit nebo přizpůsobit. Vizuální strom je obvykle složitější, protože zahrnuje například ohraničení kolem ovládacích prvků, popisky pro implicitní obsah atd. WPF obsahuje sadu rozhraní API ( a LogicalTreeHelperVisualTreeHelper ) pro prozkoumání těchto dvou grafů objektů.
V Xamarin.Forms jsou ovládací prvky, které definujete v , Page ve skutečnosti jenom jednoduché datové objekty. Podobají se reprezentaci logického stromu, ale nikdy sami nevykreslují obsah. Místo toho jsou to datový model, který ovlivňuje vykreslování prvků. Skutečné vykreslování se provádí samostatnou sadu vizuálních rendererů, které jsou namapované na každý typ ovládacího prvku. Tyto renderery jsou registrovány v každém z projektů specifických pro platformu sestaveními Xamarin.Forms specifickými pro platformu. Seznam můžete zobrazit tady. Kromě nahrazení nebo rozšíření rendereru má Xamarin.Forms také podporu efektů, které lze použít k ovlivnění nativního vykreslování pro každou platformu.
Logický/vizuální strom
V Xamarin.Forms není k dispozici žádné zveřejněné rozhraní API, které by vás proše stanice logickým stromem promítl, ale stejné informace můžete získat pomocí reflexe. Tady je například metoda, která může vytvořit výčet logických dětí s reflexí.
Grafika
Xamarin.Forms obsahuje grafický systém pro kreslení primitiv, který se nazývá Tvary. Další informace o tvarech najdete v tématu Tvary Xamarin.Forms. Kromě toho můžete k získání 2D kreslení pro více platforem zahrnout knihovny třetích stran, jako je SkiaSharp.
Zdroje informací
WPF i Xamarin.Forms mají koncept prostředků i slovníků prostředků. Do objektu můžete umístit libovolný typ objektu s klíčem a pak v objektu hledat věci, které se nezmění, nebo věci, které se mohou změnit ve slovníku ResourceDictionary{StaticResource} za {DynamicResource} běhu. Použití a mechanismy jsou stejné s jedním rozdílem: Xamarin.Forms vyžaduje, abyste definujte pro přiřazení k vlastnosti , zatímco WPF předem vytvoří a přiřadí ResourceDictionaryResources ji 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 nedefinujte ResourceDictionary , vygeneruje se chyba modulu runtime.
Styly
Styly jsou také plně podporovány v Xamarin.Forms a lze je použít k motivování prvků Xamarin.Forms, které tvoří uživatelské rozhraní. Podporují triggery (vlastnost, událost a data), dědičnost prostřednictvím a vyhledávání prostředků BasedOn pro hodnoty. Styly se aplikují na prvky buď explicitně prostřednictvím vlastnosti, nebo implicitně tím, že nezadáte klíč prostředku Style – 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, jako je ), které diktují systémové barvy, písma a metriky ve formě hodnot a klíčů SystemColors prostředků. Xamarin.Forms je podobný, ale definuje sadu stylů zařízení, které představují stejné věci. Tyto styly poskytuje rozhraní a jsou nastavené na hodnoty na základě běhového prostředí (např. přístupnost).
WPF
<Label Text="Title" Foreground="{DynamicResource {x:Static SystemColors.DesktopBrushKey}}" />
Xamarin.Forms
<Label Text="Title" Style="{DynamicResource TitleStyle}" />