Udostępnij za pośrednictwem


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, ListBoxitp.). 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:

  1. ContentPage
  2. ContentView
  3. ContentPresenter
  4. 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 strings, ints 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:

  1. {x:Array}
  2. {Binding}
  3. {DynamicResource}
  4. {x:Null}
  5. {x:Static}
  6. {StaticResource}
  7. {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:

  1. Obiekt musi pochodzić z klasy BindableObject.
  2. Aby zdefiniować klucz magazynu zapasowego dla właściwości, musi istnieć publiczne pole statyczne typu BindableProperty zadeklarowane.
  3. Powinna istnieć otoka właściwości wystąpienia publicznego, która używa GetValue elementu i do pobierania i SetValue 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 DataTemplatebiblioteki 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.

  1. Element główny obiektu DataTemplate musi być zawsze obiektem ViewCell.
  2. 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.
  3. DataTemplateSelector jest również obsługiwany, ale pochodzi z DataTemplate i dlatego jest po prostu przypisany bezpośrednio do ItemTemplate właściwości (a ItemTemplateSelector 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, UserControlktó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.

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.