Cykl życia aplikacji WPF a Xamarin.Forms

Zestaw narzędzi Xamarin.Forms zawiera wiele wskazówek dotyczących projektowania ze struktur opartych na języku XAML, które pojawiły się wcześniej, szczególnie WPF. Jednak w inny sposób znacznie odbiega od tego, co może być lepkim punktem dla osób próbujących przeprowadzić migrację. Ten dokument próbuje zidentyfikować niektóre z tych problemów i udostępnić wskazówki, jeśli to możliwe, aby połączyć wiedzę WPF z platformą Xamarin.Forms.

Cykl życia aplikacji

Cykl życia aplikacji między platformami WPF i Xamarin.Forms jest podobny. Zarówno rozpoczynanie kodu zewnętrznego (platformy) i uruchamianie interfejsu użytkownika za pomocą wywołania metody. Różnica polega na tym, że zestaw platformy Xamarin.Forms zawsze uruchamia się w zestawie specyficznym dla platformy, który następnie inicjuje i tworzy interfejs użytkownika dla aplikacji.

WPF

  • Main method > App > MainWindow

Uwaga

Metoda Main jest domyślnie automatycznie generowana i niewidoczna w kodzie.

Xamarin.Forms

  • iOSMain method > AppDelegate > App > ContentPage
  • AndroidMainActivity > App > ContentPage
  • UWPMain method > App(UWP) > MainPage(UWP) > App > ContentPage

Klasa aplikacji

Zarówno WPF, jak i Xamarin.Forms mają klasę Application , która jest tworzona jako pojedyncza. W większości przypadków aplikacje pochodzą z tej klasy, aby zapewnić aplikację niestandardową, chociaż nie jest to ściśle wymagane w WPF. Obie uwidaczniają właściwość w Application.Current celu zlokalizowania utworzonego pojedynczego elementu.

Właściwości globalne i trwałość

Zarówno WPF, jak i Xamarin.Forms mają Application.Properties dostępny słownik, w którym można przechowywać globalne obiekty na poziomie aplikacji, które są dostępne w dowolnym miejscu w aplikacji. Kluczową różnicą jest to, że platforma Xamarin.Forms będzie utrwalać wszystkie typy pierwotne przechowywane w kolekcji po zawieszeniu aplikacji i ładować je ponownie po ponownym uruchomieniu. Platforma WPF nie obsługuje tego zachowania automatycznie — zamiast tego większość deweloperów polegała na izolowanym magazynie ani nie korzystała z wbudowanej Settings obsługi.

Definiowanie stron i drzewa wizualnego

WPF używa Window jako elementu głównego dla dowolnego elementu wizualizacji najwyższego poziomu. Definiuje HWND w świecie systemu Windows do wyświetlania informacji. Można tworzyć i wyświetlać tyle okien jednocześnie, jak w WPF.

W zestawie narzędzi Xamarin.Forms wizualizacja najwyższego poziomu jest zawsze definiowana przez platformę — na przykład w systemie iOS jest to UIWindow. Platforma Xamarin.Forms renderuje zawartość w tych natywnych reprezentacjach platform przy użyciu Page klasy. Każda Page na platformie Xamarin.Forms reprezentuje unikatową "stronę" w aplikacji, gdzie tylko jedna strona jest widoczna w danym momencie.

Zarówno pliki WPFs Window , jak i Xamarin.Forms Page zawierają właściwość wpływającą Title na wyświetlany tytuł, a obie mają Icon właściwość do wyświetlania konkretnej ikony dla strony (zwróć uwagę , że tytuł i ikona nie zawsze są widoczne w zestawie narzędzi Xamarin.Forms). Ponadto można zmienić typowe właściwości wizualizacji zarówno na kolorze tła, jak i na obrazie.

Technicznie jest możliwe renderowanie do dwóch oddzielnych widoków platformy (np. definiowanie dwóch UIWindow obiektów i renderowanie drugiego na zewnętrznym wyświetlaczu lub funkcji AirPlay), wymaga kodu specyficznego dla platformy i nie jest to bezpośrednio obsługiwana funkcja platformy Xamarin.Forms.

Widoki

Hierarchia wizualizacji dla obu struktur jest podobna. WPF jest nieco głębiej ze względu na obsługę dokumentów WYSIWYG.

WPF

DependencyObject - base class for all bindable things
   Visual - rendering mechanics
      UIElement - common events + interactions
         FrameworkElement - adds layout
            Shape - 2D graphics
            Control - interactive controls

Xamarin.Forms

BindableObject - base class for all bindable things
   Element - basic parent/child support + resources + effects
      VisualElement - adds visual rendering properties (color, fonts, transforms, etc.)
         View - layout + gesture support

Wyświetl cykl życia

Zestaw narzędzi Xamarin.Forms jest głównie zorientowany na scenariusze mobilne. W związku z tym aplikacje są aktywowane, zawieszone i ponownie aktywowane, gdy użytkownik wchodzi z nimi w interakcję. Jest to podobne do kliknięcia z dala od Window w aplikacji WPF i istnieje zestaw metod i odpowiednich zdarzeń, które można zastąpić lub podłączyć do monitorowania tego zachowania.

Purpose WPF, metoda Xamarin.Forms, metoda
Początkowa aktywacja ctor + Window.OnLoaded ctor + Page.OnStart
Pokazano Window.IsVisibleChanged Page.Appearing
Ukryty Window.IsVisibleChanged Page.Disappearing (Znikanie strony)
Wstrzymywanie/utrata fokusu Window.OnDeactivated Page.OnSleep
Aktywowano/Masz fokus Window.OnActivated Page.OnResume
Zamknięcie Window.OnClosing + Window.OnClosed nie dotyczy

Obie obsługują ukrywanie/wyświetlanie kontrolek podrzędnych, a także w WPF jest to właściwość IsVisible trójstanowa (widoczna, ukryta i zwinięta). W zestawie narzędzi Xamarin.Forms jest ona po prostu widoczna lub ukryta za IsVisible pomocą właściwości .

Układ

Układ strony występuje w tym samym 2-przebiegu (miara/rozmieszczanie), który występuje w WPF. Układ strony można podłączyć, przesłaniając następujące metody w klasie Xamarin.Forms Page :

Metoda Purpose
OnChildMeasureInvalidated Preferowany rozmiar elementu podrzędnego został zmieniony.
OnSizeAllocated Do strony przypisano szerokość/wysokość.
Zdarzenie LayoutChanged Zmieniono układ/rozmiar strony.

Nie ma zdarzenia układu globalnego, które jest obecnie wywoływane, ani nie ma zdarzenia globalnego CompositionTarget.Rendering , takiego jak w WPF.

Typowe właściwości układu

WPF i Xamarin.Forms obsługują Margin zarówno kontrolowanie odstępów wokół elementu, jak i Padding kontrolowanie odstępów wewnątrz elementu. Ponadto większość widoków układu platformy Xamarin.Forms ma właściwości sterujące odstępami (np. wierszem lub kolumną).

Ponadto większość elementów ma właściwości mające wpływ na ich położenie w kontenerze nadrzędnym:

WPF Xamarin.Forms Purpose
Horizontalalignment Poziomyopcje Opcje lewy/środkowy/prawy/rozciągnięty
Verticalalignment Opcje pionowe Opcje Top/Center/Bottom/Stretch

Uwaga

Rzeczywista interpretacja tych właściwości zależy od kontenera nadrzędnego.

Widoki układu

WPF i Xamarin.Forms używają kontrolek układu do umieszczania elementów podrzędnych. W większości przypadków są one bardzo blisko siebie pod względem funkcjonalności.

WPF Xamarin.Forms Styl układu
StackPanel StackLayout Od lewej do prawej lub od góry do dołu nieskończone stosy
Siatka Siatka Format tabelaryczny (wiersze i kolumny)
DockPanel nie dotyczy Dokowanie do krawędzi okna
Kanwa AbsoluteLayout Pozycjonowanie pikseli/współrzędnych
WrapPanel nie dotyczy Zawijanie stosu
nie dotyczy RelativeLayout Względne pozycjonowanie oparte na regułach

Uwaga

Zestaw narzędzi Xamarin.Forms nie obsługuje elementu GridSplitter.

Obie platformy używają dołączonych właściwości w celu dostosowania elementów podrzędnych.

Renderowanie

Mechanika renderowania dla platform WPF i Xamarin.Forms jest radykalnie inna. W WPF kontrolki tworzone bezpośrednio renderować zawartość do pikseli na ekranie. WPF obsługuje dwa grafy obiektów (drzewa) do reprezentowania — drzewo logiczne reprezentuje kontrolki zdefiniowane w kodzie lub XAML, a drzewo wizualne reprezentuje rzeczywiste renderowanie, które występuje na ekranie, który jest wykonywany bezpośrednio przez element wizualny (za pośrednictwem metody rysowania wirtualnego) lub zdefiniowany ControlTemplate przez kod XAML, który można zamienić lub dostosować. Zazwyczaj drzewo wizualizacji jest bardziej złożone, ponieważ zawiera takie elementy jak obramowania wokół kontrolek, etykiety niejawnej zawartości itp. WPF zawiera zestaw interfejsów API (LogicalTreeHelper i VisualTreeHelper) w celu zbadania tych dwóch grafów obiektów.

Na platformie Xamarin.Forms kontrolki zdefiniowane w obiekcie Page są naprawdę prostymi obiektami danych. Są one podobne do reprezentacji drzewa logicznego, ale nigdy nie renderują zawartości samodzielnie. Zamiast tego są one modelem danych, który wpływa na renderowanie elementów. Rzeczywiste renderowanie odbywa się za pomocą oddzielnego zestawu renderatorów wizualizacji, które są mapowane na każdy typ kontrolki. Te programy renderowania są rejestrowane w każdym z projektów specyficznych dla platformy przez zestawy Xamarin.Forms specyficzne dla platformy. Listę można wyświetlić tutaj. Oprócz zastępowania lub rozszerzania modułu renderowania platforma Xamarin.Forms ma również obsługę efektów , które mogą służyć do wywierania wpływu na renderowanie natywne dla poszczególnych platform.

Drzewo logiczne/wizualne

Nie ma uwidocznionego interfejsu API do chodzenia po drzewie logicznym na platformie Xamarin.Forms — ale możesz użyć Emocje ion, aby uzyskać te same informacje. Oto na przykład metoda, która może wyliczać logiczne elementy podrzędne z odbiciem.

Karty graficzne

Zestaw narzędzi Xamarin.Forms zawiera system graficzny do rysowania elementów pierwotnych, nazywanych kształtami. Aby uzyskać więcej informacji na temat kształtów, zobacz Kształty platformy Xamarin.Forms. Ponadto możesz uwzględnić biblioteki innych firm, takie jak SkiaSharp, aby uzyskać międzyplatformowy rysunek 2D.

Zasoby

WPF i Xamarin.Forms mają pojęcie zasobów i słowników zasobów. Można umieścić dowolny typ obiektu w ResourceDictionary kluczu, a następnie wyszukać go w {StaticResource} elementach, które nie zostaną zmienione, lub {DynamicResource} dla elementów, które mogą ulec zmianie w słowniku w czasie wykonywania. Użycie i mechanika są takie same z jedną różnicą: platforma Xamarin.Forms wymaga zdefiniowania ResourceDictionary właściwości w celu przypisania do Resources właściwości, podczas gdy WPF wstępnie tworzy go i przypisuje go za Ciebie.

Zobacz na przykład poniższą definicję:

WPF

<Window.Resources>
   <Color x:Key="redColor">#ff0000</Color>
   ...
</Window.Resources>

Xamarin.Forms

<ContentPage.Resources>
   <ResourceDictionary>
      <Color x:Key="redColor">#ff0000</Color>
      ...
   </ResourceDictionary>
</ContentPage.Resources>

Jeśli nie zdefiniujesz ResourceDictionaryelementu , zostanie wygenerowany błąd środowiska uruchomieniowego.

Style

Style są również w pełni obsługiwane na platformie Xamarin.Forms i mogą służyć do motywowania elementów zestawu narzędzi Xamarin.Forms tworzących interfejs użytkownika. Obsługują wyzwalacze (właściwość, zdarzenie i dane), dziedziczenie za pomocą BasedOnmetod i wyszukiwania zasobów dla wartości. Style są stosowane do elementów jawnie za pośrednictwem Style właściwości lub niejawnie, nie podając klucza zasobu — tak jak WPF.

Style urządzenia

WPF ma zestaw wstępnie zdefiniowanych właściwości (przechowywanych jako wartości statyczne w zestawie klas statycznych, takich jak SystemColors), które określają kolory systemowe, czcionki i metryki w postaci wartości i kluczy zasobów. Zestaw stylów urządzeń Xamarin.Forms jest podobny, ale definiuje zestaw stylów urządzeń, aby reprezentować te same elementy. Te style są dostarczane przez platformę i ustawiane na wartości na podstawie środowiska uruchomieniowego (np. ułatwień dostępu).

WPF

<Label Text="Title" Foreground="{DynamicResource {x:Static SystemColors.DesktopBrushKey}}" />

Xamarin.Forms

<Label Text="Title" Style="{DynamicResource TitleStyle}" />