WPF vs. Xamarin.Forms: Rozdíly & podobností

Šablony ovládacích prvků

WPF podporuje koncept šablon ovládacích prvků, které poskytují pokyny k vizualizaci pro ovládací prvek ( , ListBox atd.). Jak je uvedeno výše, Xamarin.Forms k tomu používá konkrétní vykreslovací třídy, které komunikují s nativní platformou (iOS, Android atd.). vizualizovat ovládací prvek.

Xamarin.Forms ale má typ – používá se pro objekty s teami. Page Poskytuje definici objektu , která poskytuje konzistentní obsah, ale umožňuje uživateli stránky měnit barvy, písma atd. a dokonce přidávat prvky, aby byl pro aplikaci Page jedinečný.

Běžným způsobem použití jsou například ověřovací dialogy, výzvy a poskytnutí standardizovaného vzhledu a vzhledu stránky, který je možné přizpůsobit v rámci aplikace. V rámci této podpory se používá mnoho známých ovládacích prvků pojmenovaných WPF:

  1. ContentPage
  2. ContentView
  3. ContentPresenter
  4. TemplateBinding

Je ale důležité vědět, že v Xamarin.Forms nemají stejný účel. Další informace o této funkci najdete na stránce dokumentace.

XAML

XAML se používá jako deklarativní jazyk značek pro WPF a Xamarin.Forms. Ve většině částí je syntaxe stejná – hlavním rozdílem jsou objekty, které jsou definovány nebo vytvořeny grafy XAML.

  • Xamarin.Forms podporuje specifikaci XAML 2009; To usnadňuje definování dat, jako jsou s, s atd., a také definování obecných typů a předávání int argumentů konstruktorům.

  • V současné době neexistuje způsob, jak dynamicky načítat XAML, jako je WPF, pomocí XamlReader . Stejné základní funkce ale můžete získat s balíčkem NuGet.

Rozšíření značek

Xamarin.Forms podporuje rozšíření XAML prostřednictvím rozšíření značek, podobně jako WPF. Obsahuje stejné základní stavební bloky:

  1. {x:Array}
  2. {Binding}
  3. {DynamicResource}
  4. {x:Null}
  5. {x:Static}
  6. {StaticResource}
  7. {x:Type}

Kromě toho zahrnuje ze specifikace XAML 2009 a rozšíření značek, které se používá pro specializovanou verzi podporovanou {x:Reference}{TemplateBinding}ControlTemplate Xamarin.Forms.

Upozornění

Podpora není stejná, i když ControlTemplate má stejný název.

Xamarin.Forms podporuje také vlastní rozšíření značek, ale implementace se mírně liší. Ve WPF je nutné odvodit z MarkupExtension – abstraktní základní třídy. V Xamarin.Forms, který je nahrazen rozhraním nebo IMarkupExtensionIMarkupExtension<T> který je flexibilnější.

Stejně jako WPF je i jedna požadovaná metoda metoda, která ProvideValue vrací hodnotu z rozšíření značek.

Infrastruktura vazeb

Jedním ze základních konceptů, které se přenesly, je infrastruktura datových vazeb pro připojení vlastností vizuálu k vlastnostem dat .NET. To umožňuje vzory architektury, jako je MVVM. Základní návrh je identický – máte vazbu základní třídy BindableObject, ve WPF je to třída DependencyObject. Tato základní třída se používá jako kořenový nadřazený prvek pro všechny objekty, které se budou účastnit jako cíle v datové vazbě. Odvozené třídy pak zpřístupní objekty BindableProperty, které slouží jako základní úložiště pro hodnoty vlastností (ty jsou definovány jako objekty DependencyProperty ve WPF).

Definování vlastností s možností vazby

Definice vlastnosti s váže v Xamarin.Forms je stejná jako u WPF:

  1. Objekt musí být odvozen z BindableObject objektu .
  2. Aby bylo možné definovat zálohovací klíč úložiště pro vlastnost , musí být deklarováno veřejné BindableProperty statické pole typu .
  3. Měla by být k dispozici obálka vlastností veřejné instance, která k načtení a GetValueSetValue změně hodnoty vlastností používá a .

Kompletní příklad najdete v tématu Vlastnosti s možností vazby v Xamarin.Forms.

Připojené vlastnosti

Připojené vlastnosti jsou podmnožinou vlastnosti s možností vazby a fungují stejně jako ve WPF. Hlavní rozdíl spočívá v tom, že obálka vlastností je v tomto případě vynechána a nahrazena sadu statických metod get/set ve vlastnící třídě. Další informace najdete v části Připojené vlastnosti v Xamarin.Forms.

Použití binding engineu

Proces použití vazeb modulu je stejný jako ve WPF. Lze ji využít v kódu na pozadí vytvořením objektu vázaného na zdrojový objekt (libovolný typ .NET) a volitelnou hodnotou vlastnosti (pokud je vynechán, považuje zdrojový objekt za samotnou vlastnost – stejně jako Binding WPF). Pak můžete použít SetBinding na libovolné k přidružení vazby k BindableObjectBindableProperty .

Případně můžete definovat relaci vazby v jazyce XAML pomocí BindingExtension . Má stejné základní hodnoty jako rozšíření ve WPF.

Podpora vazeb a modul jsou více podobné implementaci Silverlight než WPF. V Xamarin.Forms existuje několik chybějících funkcí, které nebyly implementovány:

  • Ve vazbách není k dispozici žádná podpora následujících funkcí:
    • Název skupiny vazeb
    • BindsDirectlyToSource
    • Isasync
    • MultiBinding
    • NotifyOnSourceUpdated
    • NotifyOnTargetUpdated
    • NotifyOnValidationError
    • Updatesourcetrigger
    • UpdateSourceExceptionFilter
    • ValidatesOnDataErrors
    • ValidatesOnExceptions
    • Kolekce ValidationRules
    • XPath
    • Xmlnamespacemanager

RelativeSource

Vazby se RelativeSource nepodporují. Ve WPF umožňují vytvořit vazbu na další vizuální prvky definované v jazyce XAML. V Xamarin.Forms lze stejné funkce dosáhnout pomocí rozšíření {x:Reference} značek. Například za předpokladu, že máme ovládací prvek s názvem "otherControl", který má vlastnost Text, můžeme s ním vytvořit vazbu takto:

WPF

Text={Binding RelativeSource={RelativeSource otherControl}, Path=Text}

Xamarin.Forms

Text={Binding Source={x:Reference otherControl}, Path=Text}

Pro tuto funkci je možné použít stejnou {RelativeSource Self} funkci. Neexistuje však žádná podpora pro vyhledání nadřazených součástí podle typu ( {RelativeSource FindAncestor} ).

Kontext vazby

Ve WPF můžete definovat hodnotu DataContext vlastnosti, která vymezuje výchozí zdroj vazby. Pokud zdroj pro vazbu není definovaný, použije se tato hodnota vlastnosti. Hodnota se dědí dolů ve vizuálním stromu, což umožňuje, aby byla definována na vyšší úrovni a potom ji používaly děti.

V Xamarin.Forms je stejná funkce k dispozici, ale název vlastnosti je BindingContext .

Převaděče hodnot

Převaděče hodnot jsou plně podporovány v Xamarin.Forms – stejně jako WPF. Používá se stejný tvar rozhraní, ale Xamarin.Forms má rozhraní definované v oboru Xamarin.Forms názvů .

Model-View-ViewModel

Model MVVM je plně podporovaný WPF i Xamarin.Forms.

WPF obsahuje RoutedCommand předdefinování, které se někdy používá. Xamarin.Forms nemá kromě definice rozhraní žádnou integrovanou podporu ICommand příkazů. Můžete zahrnout celou řadu architektur MVVM, které přidávají nezbytné základní třídy pro implementaci MVVM.

INotifyPropertyChanged a INotifyCollectionChanged

Obě rozhraní jsou plně podporovaná ve vazbách Xamarin.Forms. Na rozdíl od mnoha architektur založených na XAML je možné oznámení o změně vlastností u vláken na pozadí v Xamarin.Forms (stejně jako WPF) vyvolat a vazební modul správně přechází na vlákno uživatelského rozhraní.

Kromě toho obě prostředí podporují a SynchronizationContextasync/await pro správné zařazování vláken. WPF obsahuje třídu na všech vizuálních prvcích, Xamarin.Forms má statickou metodu, kterou lze použít také (i když je upřednostňována DispatcherDevice.BeginInvokeOnMainThread pro kódování SynchronizationContext napříč platformami).

  • Xamarin.Forms obsahuje objekt ObservableCollection<T> , který podporuje oznámení o změně kolekce.
  • Můžete použít BindingBase.EnableCollectionSynchronization k povolení aktualizací mezi vlákny pro kolekci. Rozhraní API se mírně liší od varianty WPF. Podrobnosti o využití najdete v dokumentu.

Šablony dat

Šablony dat jsou podporovány v Xamarin.Forms pro přizpůsobení vykreslování ListView řádku (buňky). Na rozdíl od WPF, která může využívat DataTemplate s pro jakýkoliv ovládací prvek orientovaný na obsah, Xamarin. Forms je aktuálně používá pouze pro ListView . Definici šablony lze definovat jako inline (přiřazenou ItemTemplate Vlastnosti) nebo jako prostředek v ResourceDictionary .

Kromě toho nejsou poměrně tak flexibilní jako jejich protějšky WPF.

  1. Kořenový element elementu DataTemplate musí být DataTemplateViewCell objekt.
  2. Triggery dat jsou plně podporovány v datové šabloně, ale musí obsahovat DataType vlastnost určující typ vlastnosti, ke které je Trigger přidružen.
  3. DataTemplateSelector je také podporováno, ale je odvozena z DataTemplate a je tedy pouze přiřazena přímo k ItemTemplate vlastnosti (vs. ItemTemplateSelector v WPF).

ItemsControl

ItemsControlV Xamarin. Forms není k dispozici žádný vestavěný ekvivalent. ItemsControl, ale existuje vlastní.

Uživatelské ovládací prvky

V prostředí WPF, UserControl s slouží k poskytnutí oddílu uživatelského rozhraní, které má přidružené chování. V Xamarin. Forms používáme ContentView pro stejný účel. Podporuje vazby i zahrnutí v jazyce XAML.

WPF obsahuje málo používané, NavigationService které by se daly použít k poskytnutí navigační funkce podobné prohlížeči. Většina aplikací se ale bother s tím, ale místo toho používá jiné Window prvky nebo různé části okna k zobrazení dat.

V zařízeních pro telefon jsou často k disdílným řešením různé obrazovky , takže Xamarin. Forms zahrnuje podporu pro několik forem navigace:

Styl navigace Typ stránky
Založené na zásobníku (push/pop) NavigationPage
Hlavní záznamy / podrobnosti MasterDetailPage
Karty TabbedPage
Potažení vlevo a vpravo CarouselView

NavigationPageJe nejběžnějším přístupem a každá stránka má vlastnost, která se Navigation dá použít k nahrání nebo vložení stránek do a z navigačního zásobníku. Toto je nejbližší ekvivalent k NavigationService nalezenému v subsystému WPF.

Navigace URL

WPF je technologie zaměřená na stolní počítače a může přijmout parametry příkazového řádku pro přímé chování při spuštění. Xamarin. Forms může pomocí adres URL s přímým odkazem přejít na stránku při spuštění.