WPF a Xamarin.Forms: podobieństwa i różnice
Szablony kontrolek
Platforma WPF obsługuje koncepcję szablonów kontrolek, które udostępniają instrukcje wizualizacji dla kontrolki (Button
, ListBox
itp.). Jak wspomniano powyżej, platforma Xamarin.Forms używa konkretnych klas renderowania dla tej funkcji, które współdziałają z platformą natywną (iOS, Android itp.) w celu wizualizacji kontrolki.
Jednak zestaw narzędzi Xamarin.Forms maControlTemplate
typ — jest używany do tworzenia motywów Page
obiektów. Zawiera on definicję Page
elementu, która zapewnia spójną zawartość, ale umożliwia użytkownikowi strony zmianę kolorów, czcionek itp., a nawet dodawanie elementów w celu ich unikatowości w aplikacji.
Typowe zastosowania w tym przypadku to takie elementy jak okna dialogowe uwierzytelniania, monity i udostępnienie ustandaryzowanego wyglądu strony, ale można je dostosować w aplikacji. W ramach tej obsługi jest używanych wiele znanych kontrolek o nazwach WPF:
ContentPage
ContentView
ContentPresenter
TemplateBinding
Ważne jest jednak, aby wiedzieć, że nie obsługują one tego samego celu w zestawie narzędzi Xamarin.Forms. Aby uzyskać więcej informacji na temat tej funkcji, zapoznaj się ze stroną dokumentacji.
XAML
Język XAML jest używany jako język znaczników deklaratywnych dla platform WPF i Xamarin.Forms. W większości przypadków składnia jest identyczna — podstawowa różnica polega na obiektach zdefiniowanych/utworzonych przez grafy XAML.
Platforma Xamarin.Forms obsługuje specyfikację XAML 2009. Ułatwia to definiowanie danych, takich jak
string
s,int
s itp., a także definiowanie typów ogólnych i przekazywanie argumentów do konstruktorów.Obecnie nie ma możliwości dynamicznego ładowania kodu XAML, takiego jak WPF, za pomocą polecenia
XamlReader
. Możesz jednak uzyskać tę samą podstawową funkcjonalność za pomocą pakietu NuGet.
Rozszerzenia struktury znaczników
Platforma Xamarin.Forms obsługuje rozszerzanie kodu XAML za pomocą rozszerzeń znaczników, podobnie jak WPF. Poza pudełkiem ma on te same podstawowe bloki konstrukcyjne:
{x:Array}
{Binding}
{DynamicResource}
{x:Null}
{x:Static}
{StaticResource}
{x:Type}
Ponadto zawiera {x:Reference}
ona specyfikację XAML 2009 oraz {TemplateBinding}
rozszerzenie znaczników, które jest używane do wyspecjalizowanej wersji obsługiwanej ControlTemplate
przez platformę Xamarin.Forms.
Ostrzeżenie
Obsługa ControlTemplate
nie jest taka sama — mimo że ma taką samą nazwę.
Platforma Xamarin.Forms obsługuje również niestandardowe rozszerzenia znaczników — ale implementacja jest nieco inna. W WPF musisz pochodzić z MarkupExtension
— abstrakcyjnej klasy bazowej. W zestawie narzędzi Xamarin.Forms jest on zastępowany interfejsem IMarkupExtension
lub IMarkupExtension<T>
jest bardziej elastyczny.
Podobnie jak WPF, pojedyncza ProvideValue
wymagana metoda jest metodą zwracania wartości z rozszerzenia znaczników.
Wiązanie infrastruktury
Jedną z podstawowych koncepcji przenoszonych jest infrastruktura powiązania danych w celu połączenia właściwości wizualizacji z właściwościami danych platformy .NET. Umożliwia to wzorce architektury, takie jak MVVM. Podstawowy projekt jest identyczny — istnieje powiązana klasa bazowa BindableObject, w WPF jest to klasa DependencyObject . Ta klasa bazowa jest używana jako główny obiekt nadrzędny dla wszystkich obiektów, które będą uczestniczyć jako obiekty docelowe w powiązaniu danych. Klasy pochodne uwidaczniają następnie obiekty BindableProperty , które działają jako magazyn zapasowy dla wartości właściwości (są one zdefiniowane jako obiekty DependencyProperty w WPF).
Definiowanie właściwości możliwych do powiązania
Definicja właściwości możliwej do powiązania na platformie Xamarin.Forms jest taka sama jak WPF:
- Obiekt musi pochodzić z klasy
BindableObject
. - Aby zdefiniować klucz magazynu zapasowego dla właściwości, musi istnieć publiczne pole statyczne typu
BindableProperty
zadeklarowane. - Powinna istnieć otoka właściwości wystąpienia publicznego, która używa
GetValue
elementu i do pobierania iSetValue
zmieniania wartości właściwości.
Pełny przykład można znaleźć w temacie Bindable Properties in Xamarin.Forms (Właściwości możliwe do powiązania na platformie Xamarin.Forms).
Dołączone właściwości
Dołączone właściwości są podzbiorem właściwości możliwej do powiązania i działają tak samo jak w WPF. Podstawową różnicą jest to, że otoka właściwości została pominięta w tym przypadku i zastąpiona zestawem statycznych metod get/set w klasie będącej właścicielem. Aby uzyskać więcej informacji, zobacz Dołączone właściwości na platformie Xamarin.Forms .
Korzystanie z aparatu powiązania
Proces korzystania z aparatu powiązania jest taki sam jak w WPF. Można go używać w kodzie, tworząc Binding
obiekt powiązany z obiektem źródłowym (dowolnym typem platformy .NET) i opcjonalną wartością właściwości (jeśli pominięto, traktuje obiekt źródłowy jako samą właściwość — podobnie jak WPF). Następnie można użyć polecenia SetBinding
w dowolnym BindableObject
celu, aby skojarzyć powiązanie z elementem BindableProperty
.
Alternatywnie można zdefiniować relację powiązania w języku XAML przy użyciu elementu BindingExtension
. Ma te same wartości podstawowe co rozszerzenie w WPF.
Obsługa powiązań i aparat są bardziej podobne do implementacji silverlight niż WPF. Istnieje kilka brakujących funkcji, które nie zostały zaimplementowane na platformie Xamarin.Forms:
- Brak obsługi następujących funkcji w powiązaniach:
- Bindinggroupname
- BindsDirectlyToSource
- Isasync
- MultiBinding
- NotifyOnSourceUpdated
- NotifyOnTargetUpdated
- NotifyOnValidationError
- Updatesourcetrigger
- UpdateSourceExceptionFilter
- ValidatesOnDataErrors
- ValidatesOnExceptions
- Kolekcja ValidationRules
- XPath
- Xmlnamespacemanager
Relativesource
Nie ma obsługi RelativeSource
powiązań. W WPF umożliwiają one powiązanie z innymi elementami wizualnymi zdefiniowanymi w języku XAML. W środowisku Xamarin.Forms tę samą funkcję można osiągnąć przy użyciu {x:Reference}
rozszerzenia znaczników. Załóżmy na przykład, że mamy kontrolkę o nazwie "otherControl", która ma właściwość Text, możemy powiązać z nią w następujący sposób:
WPF
Text={Binding RelativeSource={RelativeSource otherControl}, Path=Text}
Xamarin.Forms
Text={Binding Source={x:Reference otherControl}, Path=Text}
Tej samej funkcji można używać.{RelativeSource Self}
Nie ma jednak obsługi lokalizowania przodków według typu ({RelativeSource FindAncestor}
).
Kontekst powiązania
W WPF można zdefiniować DataContext
wartość właściwości, która reprents domyślne źródło powiązania. Jeśli źródło powiązania nie jest zdefiniowane, ta wartość właściwości jest używana. Wartość jest dziedziczona w dół drzewa wizualnego, co pozwala na zdefiniowanie go na wyższym poziomie, a następnie używane przez elementy podrzędne.
W zestawie narzędzi Xamarin.Forms ta sama funkcja jest dostępna, ale nazwa właściwości to BindingContext
.
Konwertery wartości
Konwertery wartości są w pełni obsługiwane w środowisku Xamarin.Forms — podobnie jak WPF. Używany jest ten sam kształt interfejsu, ale zestaw narzędzi Xamarin.Forms ma interfejs zdefiniowany w Xamarin.Forms
przestrzeni nazw.
Model-View-ViewModel
Maszyny MVVM są całkowicie obsługiwane zarówno przez platformy WPF, jak i platformę Xamarin.Forms.
WPF zawiera wbudowany element, w RoutedCommand
którym czasami jest używany; Zestaw narzędzi Xamarin.Forms nie obsługuje wbudowanych poleceń poza definicją interfejsu ICommand
. Możesz dołączyć różne struktury MVVM, aby dodać niezbędne klasy bazowe do zaimplementowania maszyny wirtualnej MVVM.
INotifyPropertyChanged i INotifyCollectionChanged
Oba interfejsy są w pełni obsługiwane w powiązaniach platformy Xamarin.Forms. W przeciwieństwie do wielu platform opartych na języku XAML powiadomienia o zmianie właściwości można zgłaszać w wątkach w tle na platformie Xamarin.Forms (podobnie jak WPF), a aparat powiązania będzie prawidłowo przechodzić do wątku interfejsu użytkownika.
Ponadto, zarówno środowiska obsługują SynchronizationContext
, jak i async
/await
do właściwego marshalingu wątków. WPF zawiera klasę Dispatcher
we wszystkich elementach wizualizacji, platforma Xamarin.Forms ma również metodę Device.BeginInvokeOnMainThread
statyczną, która może być również używana (chociaż SynchronizationContext
jest preferowana do kodowania międzyplatformowego).
- Zestaw narzędzi Xamarin.Forms zawiera element
ObservableCollection<T>
, który obsługuje powiadomienia o zmianie kolekcji. - Możesz użyć
BindingBase.EnableCollectionSynchronization
polecenia , aby włączyć aktualizacje między wątkami dla kolekcji. Interfejs API różni się nieco od odmiany WPF. Sprawdź dokumenty pod kątem szczegółów użycia.
Szablony danych
Szablony danych są obsługiwane na platformie Xamarin.Forms, aby dostosować renderowanie ListView
wiersza (komórki). W przeciwieństwie do platformy WPF, która może korzystać z DataTemplate
biblioteki s dla dowolnej kontrolki zorientowanej na zawartość, platforma Xamarin.Forms obecnie używa ich tylko dla programu ListView
. Definicję szablonu można zdefiniować w tekście (przypisaną do ItemTemplate
właściwości) lub jako zasób w obiekcie ResourceDictionary
.
Ponadto nie są one tak elastyczne, jak ich odpowiednik WPF.
- Element główny obiektu
DataTemplate
musi być zawsze obiektemViewCell
. - Wyzwalacze danych są w pełni obsługiwane w szablonie danych, ale muszą zawierać właściwość wskazującą
DataType
typ właściwości, z którą jest skojarzony wyzwalacz. DataTemplateSelector
jest również obsługiwany, ale pochodzi zDataTemplate
i dlatego jest po prostu przypisany bezpośrednio doItemTemplate
właściwości (aItemTemplateSelector
w WPF).
Itemscontrol
Nie ma wbudowanego odpowiednika ItemsControl
w zestawie narzędzi Xamarin.Forms, ale istnieje niestandardowy element dla zestawu narzędzi Xamarin.Forms dostępny tutaj.
Kontrolki użytkownika
W WPF są używane do udostępniania sekcji interfejsu użytkownika, UserControl
która ma skojarzone zachowanie. W środowisku Xamarin.Forms używamy elementu ContentView
w tym samym celu. Obsługa powiązania i dołączania w języku XAML.
Nawigacja
WPF zawiera rzadko używane, NavigationService
które mogą służyć do zapewnienia funkcji nawigacji przypominającej przeglądarkę. Większość aplikacji nie przeszkadzała jednak temu i zamiast tego używała różnych Window
elementów lub różnych sekcji okna do wyświetlania danych.
Na urządzeniach telefonicznych różne ekrany są często rozwiązaniem, dlatego platforma Xamarin.Forms obsługuje kilka form nawigacji:
Styl nawigacji | Typ strony |
---|---|
Oparte na stosie (wypychanie/pop) | Strona nawigacji |
Rekord główny/szczegóły | MasterDetailPage |
Karty | TabbedPage |
Szybkie przesunięcie w lewo/w prawo | CarouselView |
Jest NavigationPage
to najbardziej typowe podejście, a każda strona ma Navigation
właściwość, która może służyć do wypychania lub wyskakujących stron do stosu nawigacji i wyłączania go. Jest to najbliższy odpowiednik znalezionego NavigationService
w WPF.
Nawigacja po adresach URL
WPF to technologia zorientowana na komputery i może akceptować parametry wiersza polecenia w celu bezpośredniego zachowania uruchamiania. Zestaw narzędzi Xamarin.Forms może używać bezpośredniego łączenia adresów URL, aby przejść do strony podczas uruchamiania.