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

  • iOSMain method > AppDelegate > App > ContentPage
  • AndroidMainActivity > App > ContentPage
  • UPWMain 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 BasedOna 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}" />