Sdílet prostřednictvím


WPF vs. Xamarin.Forms: Podobnosti a rozdíly

Šablony ovládacích prvků

WPF podporuje koncept šablon ovládacích prvků, které poskytují pokyny pro vizualizaci ovládacího prvku (ButtonatdListBox.). Jak je uvedeno výše, Xamarin.Forms používá konkrétní třídy vykreslování , které interagují s nativní platformou (iOS, Android atd.) k vizualizaci ovládacího prvku.

Xamarin.Forms však má ControlTemplate typ – používá se pro motivy Page objektů. Poskytuje definici, Page 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 jedinečný.

Mezi běžné použití patří například dialogy ověřování, výzvy a zadání standardizovaného vzhledu stránky, ale snadno použitelného vzhledu a chování stránky, které je možné v aplikaci přizpůsobit. V rámci této podpory se používá mnoho známých ovládacích prvků s názvem WPF:

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

Je ale důležité vědět, že tyto funkce v Xamarin.Forms neslouží stejnému účelu. 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ě případů je syntaxe identická – primární rozdíl je objekty definované nebo vytvořené grafy XAML.

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

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

Rozšíření značek

Xamarin.Forms podporuje rozšíření XAML prostřednictvím rozšíření značek, podobně jako WPF. V krabici má 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 {x:Reference} ze specifikace XAML 2009 a {TemplateBinding} rozšíření značek, které se používá pro specializovanou verzi ControlTemplate podporovanou Xamarin.Forms.

Upozorňující

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

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

Stejně jako WPF je jedinou požadovanou metodou ProvideValue metoda pro vrácení hodnoty z rozšíření značek.

Vazba infrastruktury

Jedním ze základních konceptů přenesených je infrastruktura datové vazby pro připojení vizuálních vlastností k datovým vlastnostem .NET. To umožňuje architektonické vzory, jako je MVVM. Základní návrh je identický – máte bindable základní třídu BindableObject, v WPF je to DependencyObject třída. Tato základní třída se používá jako kořenový nadřazený objekt pro všechny objekty, které se budou účastnit jako cíle v datové vazbě. Odvozené třídy pak vystavit BindableProperty objekty, které fungují jako záložní úložiště pro hodnoty vlastností (jsou definovány jako DependencyProperty objekty v WPF).

Definování vlastností s možností vytvoření vazby

Definice bindable vlastnost v Xamarin.Forms je stejná jako WPF:

  1. Objekt musí být odvozen od BindableObject.
  2. Aby bylo možné definovat záložní klíč úložiště pro vlastnost, musí existovat veřejné statické pole typu BindableProperty .
  3. Měl by existovat obálka vlastností veřejné instance, která používá GetValue a SetValue načítá a mění hodnotu vlastností.

Úplný příklad naleznete v tématu Bindable Properties in Xamarin.Forms.

Připojené vlastnosti

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

Použití vazbového stroje

Proces použití vazbového modulu je stejný jako ve WPF. Můžete ho využít v kódu tak, že vytvoříte Binding objekt svázaný se zdrojovým objektem (libovolný typ .NET) a volitelnou hodnotou vlastnosti (pokud ji vynecháte, považuje zdrojový objekt za samotnou vlastnost – stejně jako WPF). Vazby pak můžete přidružit SetBinding k libovolnému BindableObject BindableProperty.

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

Podpora vazeb a modul jsou více podobné implementaci Silverlightu než WPF. V Xamarin.Forms se neimplementovalo několik chybějících funkcí:

  • V vazbách nejsou podporovány následující funkce:
    • BindingGroupName
    • BindsDirectlyToSource
    • IsAsync
    • MultiBinding
    • NotifyOnSourceUpdated
    • NotifyOnTargetUpdated
    • NotifyOnValidationError
    • UpdateSourceTrigger
    • UpdateSourceExceptionFilter
    • ValidatesOnDataErrors
    • ValidatesOnExceptions
    • Kolekce ValidationRules
    • XPath
    • XmlNamespaceManager

Relativní zdroj

Vazby nejsou podporovány RelativeSource . Ve WPF umožňují vytvořit vazbu k jiným vizuálním prvkům definovaným v jazyce XAML. V Xamarin.Forms lze tuto stejnou funkci dosáhnout pomocí {x:Reference} rozšíření značek. Předpokládejme například, že máme ovládací prvek s názvem "otherControl", který má vlastnost Text, můžeme vytvořit vazbu s tímto způsobem:

WPF

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

Xamarin.Forms

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

Stejnou funkci lze použít i pro {RelativeSource Self} tuto funkci. Neexistuje však podpora pro vyhledání nadřazených objektů podle typu ({RelativeSource FindAncestor}).

Kontext vazby

Ve WPF můžete definovat DataContext hodnotu vlastnosti, která znovu načte výchozí zdroj vazby. Pokud zdroj vazby není definován, použije se tato hodnota vlastnosti. Hodnota je zděděna ve stromu vizuálu, což umožňuje definovat na vyšší úrovni a pak ji používat podřízené položky.

V Xamarin.Forms je tato 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ý obrazec rozhraní, ale Xamarin.Forms má rozhraní definované v Xamarin.Forms oboru názvů.

Model-View-ViewModel

Virtuální počítač MVVM je plně podporovaný wpf i Xamarin.Forms.

WPF obsahuje integrovaný RoutedCommand , který se někdy používá; Xamarin.Forms nemá žádnou integrovanou podporu příkazů nad ICommand rámec definice rozhraní. Můžete zahrnout celou řadu architektur MVVM pro přidání nezbytných základních tříd 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 se oznámení o změnách vlastností dají zvýšit na vlákna na pozadí v Xamarin.Forms (stejně jako WPF) a modul vazeb správně přejde do vlákna uživatelského rozhraní.

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

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

Š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 DataTemplatepro jakýkoli ovládací prvek orientovaný na obsah, Xamarin.Forms je v současné době používá pouze pro ListView. Definice šablony může být definována jako vložená (přiřazená k ItemTemplate vlastnosti) nebo jako prostředek v objektu ResourceDictionary.

Kromě toho nejsou tak flexibilní jako jejich protějšk WPF.

  1. Kořenový prvek DataTemplate musí být ViewCell vždy objekt.
  2. Triggery dat jsou plně podporovány v šabloně dat, ale musí obsahovat DataType vlastnost označující typ vlastnosti, ke které je aktivační událost přidružena.
  3. DataTemplateSelector je také podporována, ale je odvozena z DataTemplate a je proto pouze přiřazena přímo k ItemTemplate vlastnosti (vs. ItemTemplateSelector v WPF).

ItemsControl

V Xamarin.Forms neexistuje žádný předdefinovaný ekvivalent ItemsControl , ale pro Xamarin.Forms je k dispozici vlastní.

Uživatelské ovládací prvky

Ve WPF UserControlse používá k poskytnutí části uživatelského rozhraní, která má přidružené chování. V Xamarin.Forms používáme stejný ContentView účel. Podporuje vazby i zahrnutí do XAML.

WPF obsahuje zřídka používané NavigationService funkce, které se dají použít k poskytování navigační funkce podobné prohlížeči. Většina aplikací to ale neobtěžovala a místo toho používala různé Window prvky nebo různé části okna k zobrazení dat.

Na telefonních zařízeních se často používají různé obrazovky, takže Xamarin.Forms podporuje několik forem navigace:

Styl navigace Typ stránky
Stack-based (push/pop) NavigationPage
Hlavní záznamy / podrobnosti MasterDetailPage
Karty TabbedPage
Potáhněte prstem doleva nebo doprava CarouselView

Jedná se NavigationPage o nejběžnější přístup a každá stránka má Navigation vlastnost, která se dá použít k nasdílení nebo zapnutí nebo vypnutí navigačního zásobníku. Toto je nejblíže ekvivalentu nalezeného NavigationService ve WPF.

Navigace v adrese URL

WPF je desktopová technologie a může přijímat parametry příkazového řádku pro přímé chování při spuštění. Xamarin.Forms může pomocí odkazu na hloubkovou adresu URL přejít na stránku při spuštění.