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 (Button
atdListBox
.). 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:
ContentPage
ContentView
ContentPresenter
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
string
jsou s,int
s 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:
{x:Array}
{Binding}
{DynamicResource}
{x:Null}
{x:Static}
{StaticResource}
{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:
- Objekt musí být odvozen od
BindableObject
. - Aby bylo možné definovat záložní klíč úložiště pro vlastnost, musí existovat veřejné statické pole typu
BindableProperty
. - Měl by existovat obálka vlastností veřejné instance, která používá
GetValue
aSetValue
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 DataTemplate
pro 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.
- Kořenový prvek
DataTemplate
musí býtViewCell
vždy objekt. - 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. DataTemplateSelector
je také podporována, ale je odvozena zDataTemplate
a je proto pouze přiřazena přímo kItemTemplate
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 UserControl
se 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.
Navigace
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í.