Ž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}" />