WPF ile Xamarin.Forms Uygulama Yaşam Döngüsü karşılaştırması
Xamarin.Forms, başta WPF olmak üzere ondan önce gelen XAML tabanlı çerçevelerden birçok tasarım kılavuzu alır. Ancak, başka şekillerde, geçiş yapmaya çalışan kişiler için yapışkan bir nokta olabilecek önemli ölçüde sapma gösterir. Bu belge bu sorunlardan bazılarını belirlemeye çalışır ve WPF bilgisini Xamarin.Forms ile köprülemenin mümkün olduğu durumlarda rehberlik sağlar.
Uygulama Yaşam Döngüsü
WPF ile Xamarin.Forms arasındaki uygulama yaşam döngüsü benzerdir. Her ikisi de dış (platform) koduyla başlar ve bir yöntem çağrısı aracılığıyla kullanıcı arabirimini başlatır. Fark, Xamarin.Forms'un her zaman platforma özgü bir derlemede başlaması ve ardından uygulama için kullanıcı arabirimini başlatması ve oluşturmasıdır.
WPF
Main method > App > MainWindow
Not
Main
Yöntemi varsayılan olarak otomatik olarak oluşturulur ve kodda görünmez.
Xamarin.Forms
- iOS –
Main method > AppDelegate > App > ContentPage
- Android –
MainActivity > App > ContentPage
- UWP –
Main method > App(UWP) > MainPage(UWP) > App > ContentPage
Uygulama sınıfı
Hem WPF hem de Xamarin.Forms tekil olarak oluşturulan bir sınıfa sahiptir Application
. Çoğu durumda, uygulamalar özel bir uygulama sağlamak için bu sınıftan türetilir, ancak bu WPF'de kesinlikle gerekli değildir. Her ikisi de oluşturulan singleton'ı bulmak için bir Application.Current
özelliği kullanıma sunar.
Genel özellikler + kalıcılık
Hem WPF hem de Xamarin.Forms'un, uygulamanın herhangi bir yerinde erişilebilen genel uygulama düzeyinde nesneleri depolayabileceğiniz bir Application.Properties
sözlüğü vardır. Önemli fark, Xamarin.Forms'un uygulama askıya alınırken koleksiyonda depolanan tüm temel türleri kalıcı hale getirmesi ve yeniden başlatıldığında bunları yeniden yüklemesidir. WPF bu davranışı otomatik olarak desteklemez; bunun yerine çoğu geliştirici yalıtılmış depolamaya dayanır veya yerleşik Settings
desteği kullanır.
Sayfaları ve Görsel Ağacı tanımlama
WPF, herhangi bir üst düzey görsel öğesi için kök öğesi olarak öğesini Window
kullanır. Bu, bilgileri görüntülemek için Windows dünyasında bir HWND tanımlar. WPF'de istediğiniz sayıda pencereyi aynı anda oluşturabilir ve görüntüleyebilirsiniz.
Xamarin.Forms'da üst düzey görsel her zaman platform tarafından tanımlanır. Örneğin iOS'ta bu bir UIWindow
olur. Xamarin.Forms, bir sınıf kullanarak Page
içeriği bu yerel platform gösterimlerinde işler. Xamarin.Forms'daki her Page
biri uygulamadaki benzersiz bir "sayfayı" temsil eder ve tek seferde yalnızca bir sayfa görünür.
Hem WPF'ler Window
hem de Xamarin.Forms Page
, görüntülenen başlığı etkileyen bir Title
özellik içerir ve her ikisinin de sayfa için belirli bir simgeyi görüntüleyen bir Icon
özelliği vardır (Başlığın ve simgenin Xamarin.Forms'da her zaman görünür olmadığını unutmayın ). Buna ek olarak, arka plan rengi veya resim gibi her ikisinde de ortak görsel özelliklerini değiştirebilirsiniz.
teknik olarak iki ayrı platform görünümüne işlemek mümkündür (örneğin, iki UIWindow
nesne tanımlamak ve ikincisini harici bir ekrana veya AirPlay'e işlemek), bunu yapmak için platforma özgü kod gerektirir ve Xamarin.Forms'un doğrudan desteklenen bir özelliği değildir.
Görünümler
Her iki çerçevenin de görsel hiyerarşisi benzerdir. WPF, WYSIWYG belgelerine yönelik desteği nedeniyle biraz daha derindir.
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
Yaşam Döngüsünü Görüntüle
Xamarin.Forms öncelikli olarak mobil senaryolara yöneliktir. Bu nedenle, kullanıcı bunlarla etkileşime geçtikçe uygulamalar etkinleştirilir, askıya alınır ve yeniden etkinleştirilir . Bu, bir WPF uygulamasında öğesinin Window
dışında bir yere tıklamaya benzer ve bu davranışı izlemek için geçersiz kılabileceğiniz veya bağlanabileceğiniz bir dizi yöntem ve ilgili olay vardır.
Purpose | WPF Yöntemi | Xamarin.Forms Yöntemi |
---|---|---|
İlk etkinleştirme | ctor + Window.OnLoaded | ctor + Page.OnStart |
Gösterilen | Window.IsVisibleChanged | Page.Appearing |
Gizli | Window.IsVisibleChanged | Page.Disappearing |
Askıya Alma/Kayıp odağı | Window.OnDeactivated | Page.OnSleep |
Etkinleştirildi/Odak alınıyor | Window.OnActivated | Page.OnResume |
Closed | Window.OnClosing + Window.OnClosed | yok |
Her ikisi de alt denetimleri gizlemeyi/göstermeyi destekler; WPF'de bu bir üç durumlu özelliktir IsVisible
(görünür, gizli ve daraltılmış). Xamarin.Forms'da yalnızca özelliği aracılığıyla görünür veya gizlenir IsVisible
.
Düzen
Sayfa düzeni WPF'de gerçekleşen aynı 2 geçişli (Ölçü/Düzenleme) içinde gerçekleşir. Xamarin.Forms Page
sınıfında aşağıdaki yöntemleri geçersiz kılarak sayfa düzenine bağlanabilirsiniz:
Yöntem | Purpose |
---|---|
OnChildMeasureInvalidated | Bir çocuğun tercih edilen boyutu değişti. |
OnSizeAllocated | Sayfaya genişlik/yükseklik atanmış. |
LayoutChanged olayı | Sayfanın düzeni/boyutu değişti. |
Bugün olarak adlandırılan bir genel düzen olayı veya WPF'de bulunan gibi genel CompositionTarget.Rendering
bir olay yoktur.
Ortak düzen özellikleri
WPF ve Xamarin.Forms hem öğenin etrafındaki aralığı denetlemeyi hem de Padding
öğenin içindeki aralığı denetlemeyi desteklerMargin
. Ayrıca, Xamarin.Forms düzen görünümlerinin çoğu aralığı (örneğin satır veya sütun) denetleme özelliklerine sahiptir.
Ayrıca çoğu öğe, üst kapsayıcıda nasıl konumlandırıldıklarını etkileyen özelliklere sahiptir:
WPF | Xamarin.Forms | Purpose |
---|---|---|
Horizontalalignment | HorizontalOptions | Sol/Orta/Sağ/Esnetme seçenekleri |
Verticalalignment | VerticalOptions | Üst/Orta/Alt/Esnetme seçenekleri |
Not
Bu özelliklerin gerçek yorumu üst kapsayıcıya bağlıdır.
Düzen görünümleri
WPF ve Xamarin.Forms'un her ikisi de alt öğeleri konumlandırmak için düzen denetimlerini kullanır. Çoğu durumda, bunlar işlevsellik açısından birbirine çok yakındır.
WPF | Xamarin.Forms | Düzen Stili |
---|---|---|
StackPanel | StackLayout | Soldan sağa veya yukarıdan aşağıya sonsuz yığınlama |
Kılavuz | Kılavuz | Tablosal biçim (satırlar ve sütunlar) |
DockPanel | yok | Pencerenin kenarlarına yerleştirme |
Tuval | AbsoluteLayout | Piksel/Koordinat konumlandırma |
WrapPanel | yok | Sarmalama yığını |
yok | RelativeLayout | Göreli kural tabanlı konumlandırma |
Not
Xamarin.Forms bir GridSplitter
desteklemez.
Her iki platformda da alt öğelere ince ayar yapmak için ekli özellikler kullanılır.
İşleme
WPF ve Xamarin.Forms için işleme mekaniği kökten farklıdır. WPF'de, oluşturduğunuz denetimler içeriği doğrudan ekrandaki piksellere işler. WPF bunu göstermek için iki nesne grafiği (ağaç) tutar- mantıksal ağaç , kod veya XAML'de tanımlandığı gibi denetimleri temsil eder ve görsel ağaç doğrudan görsel öğesi (bir sanal çizim yöntemi aracılığıyla) veya değiştirilebilen veya özelleştirilebilen XAML tanımlı ControlTemplate
bir aracılığıyla gerçekleştirilen ekranda gerçekleşen gerçek işlemeyi temsil eder. Genellikle, görsel ağaç denetimlerin etrafındaki kenarlıklar, örtük içerik etiketleri gibi öğeleri içerdiğinden daha karmaşıktır. WPF, bu iki nesne grafiğini incelemek için bir dizi API (LogicalTreeHelper
ve VisualTreeHelper
) içerir.
Xamarin.Forms'da Page
tanımladığınız denetimler yalnızca basit veri nesneleridir. Mantıksal ağaç gösterimine benzerler, ancak hiçbir zaman içeriği kendi başlarına işlemez. Bunun yerine, öğelerin işlenmesini etkileyen veri modelidir . Gerçek işleme, her denetim türüne eşlenen ayrı bir görsel işleyici kümesi tarafından gerçekleştirilir. Bu işleyiciler platforma özgü her bir projede platforma özgü Xamarin.Forms derlemeleri tarafından kaydedilir. Burada bir liste görebilirsiniz. Xamarin.Forms, işleyiciyi değiştirmenin veya genişletmenin yanı sıra, platform başına yerel işlemeyi etkilemek için kullanılabilen Efektler desteğine de sahiptir.
Mantıksal/Görsel Ağaç
Xamarin.Forms'da mantıksal ağaçta gezinmek için kullanıma sunulan bir API yoktur; ancak aynı bilgileri almak için Düşünceler ion'ı kullanabilirsiniz. Örneğin, yansımalı mantıksal alt öğeleri numaralandırabilen bir yöntem aşağıda verilmiştir.
Grafik
Xamarin.Forms, şekiller olarak adlandırılan temel öğeler çizmeye yönelik bir grafik sistemi içerir. Şekiller hakkında daha fazla bilgi için bkz . Xamarin.Forms Şekilleri. Ayrıca, platformlar arası 2B çizim elde etmek için SkiaSharp gibi üçüncü taraf kitaplıkları da ekleyebilirsiniz.
Kaynaklar
WPF ve Xamarin.Forms'un her ikisi de kaynak ve kaynak sözlükleri kavramına sahiptir. Herhangi bir nesne türünü ResourceDictionary
bir anahtarla içine yerleştirip değiştirmeyecek {StaticResource}
şeyler veya {DynamicResource}
çalışma zamanında sözlükte değişebilecek şeyler için arayabilirsiniz. Kullanım ve mekanik tek bir farkla aynıdır: Xamarin.Forms özelliğine atamak için Resources
öğesini tanımlamanızı ResourceDictionary
gerektirirken WPF bir tane oluşturur ve sizin için atar.
Örneğin, aşağıdaki tanıma bakın:
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>
tanımlamazsanız ResourceDictionary
bir çalışma zamanı hatası oluşturulur.
Stiller
Stiller Xamarin.Forms'da da tam olarak desteklenir ve kullanıcı arabirimini oluşturan Xamarin.Forms öğelerinin temasını oluşturmak için kullanılabilir. Tetikleyicileri (özellik, olay ve veriler), aracılığıyla BasedOn
devralmayı ve değerler için kaynak aramalarını destekler. Stiller, öğelere açıkça özelliği aracılığıyla Style
veya örtük olarak wpf gibi bir kaynak anahtarı sağlamayarak uygulanır.
Cihaz Stilleri
WPF, sistem renklerini, yazı tiplerini ve ölçümleri değerler ve kaynak anahtarları biçiminde dikte eden önceden tanımlanmış özellikler kümesine (gibi statik sınıflar kümesinde statik değerler olarak SystemColors
depolanır) sahiptir. Xamarin.Forms benzerdir, ancak aynı şeyleri temsil etmek için bir dizi Cihaz Stili tanımlar. Bu stiller çerçeve tarafından sağlanır ve çalışma zamanı ortamına (örneğin erişilebilirlik) göre değerlere ayarlanır.
WPF
<Label Text="Title" Foreground="{DynamicResource {x:Static SystemColors.DesktopBrushKey}}" />
Xamarin.Forms
<Label Text="Title" Style="{DynamicResource TitleStyle}" />