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
- iOS —
Main method > AppDelegate > App > ContentPage
- Android —
MainActivity > App > ContentPage
- UWP —
Main 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 ResourceDictionary
elementu , 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ą BasedOn
metod 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}" />