WPF ile Xamarin. Forms uygulama yaşam döngüsü
Xamarin. Forms, bu, özellikle WPF 'den önce gelen XAML tabanlı çerçevelerden çok sayıda tasarım kılavuzu alır. Bununla birlikte, diğer yollarla, geçiş yapmaya çalışan kişiler için bir yapışkan nokta olabilecek önemli ölçüde farklılık gösterir. Bu belge, bu sorunlardan bazılarını belirlemeyi dener ve WPF bilgisini Xamarin. Forms 'a köprü oluşturmak için mümkün olduğunca rehberlik sağlar.
Uygulama Yaşam Döngüsü
WPF ve Xamarin. Forms arasındaki uygulama yaşam döngüsü benzerdir. Her ikisi de dış (Platform) kodunda başlar ve bir yöntem çağrısıyla Kullanıcı arabirimini başlatın. Bu fark, Xamarin. Forms 'un her zaman bir platforma özgü derlemede başlamasını, daha sonra uygulamanın kullanıcı arabirimini başlatan ve oluşturur.
WPF
Main method > App > MainWindow
Not
MainYöntemi, varsayılan olarak otomatik olarak oluşturulur ve kodda görünmez.
Xamarin.Forms
- iOS –
- Android –
- UWP –
Uygulama sınıfı
Hem WPF hem de Xamarin. Forms Application , tek olarak oluşturulan bir sınıfa sahiptir. Çoğu durumda, uygulamalar bu sınıftan özel bir uygulama sağlamak için türetilir, ancak WPF 'de kesinlikle gerekli değildir. Her ikisi de Application.Current oluşturulan Singleton öğesini bulmak için bir özellik sunar.
Genel Özellikler + Kalıcılık
Hem WPF hem de Xamarin. Forms Application.Properties 'ta, uygulamanın herhangi bir yerinden erişilebilen küresel uygulama düzeyi nesneleri depolayabileceğiniz bir sözlük bulunur. Temel fark, Xamarin. Forms 'un, uygulama askıya alındığında koleksiyonda depolanan tüm ilkel türleri kalıcı hale getirebileceği ve geri yüklenirken yeniden yüklenmesi gerektiğidir. WPF, bu davranışı otomatik olarak desteklemez; bunun yerine, çoğu geliştirici yalıtılmış depolamaya bağlıdır veya yerleşik desteğini kullanmıştır Settings .
Sayfaları ve görsel ağacı tanımlama
WPF, Window her üst düzey görsel öğe için kök öğe olarak öğesini kullanır. bu, bilgileri göstermek için Windows dünyasında bir HWND tanımlar. WPF 'de dilediğiniz kadar aynı anda oluşturabilir ve görüntüleyebilirsiniz.
Xamarin. Forms 'da, en üst düzey görsel her zaman platform tarafından tanımlanır. Örneğin, iOS üzerinde UIWindow . Xamarin. Forms, bir sınıfı kullanarak bu yerel platform temsillerine içeriğini işler Page . PageXamarin. Forms içinde her biri, uygulamadaki benzersiz bir "sayfa" ı temsil eder; burada tek seferde yalnızca bir tane görünür.
Her iki WPFs Window ve Xamarin. Forms PageTitle , görüntülenen başlığı etkileyen bir özellik içerir ve her ikisi de Icon sayfa için belirli bir simgeyi görüntüleyen bir özelliğe sahiptir (başlık ve simgenin Xamarin. Forms içinde her zaman görülemeyeceğiniWindow ). Ayrıca, arka plan rengi veya görüntüsü gibi ortak görsel özellikleri de değiştirebilirsiniz.
Teknik olarak iki ayrı platform görünümüne (örn. iki UIWindow nesne tanımlayın ve ikinci bir, bir dış görüntü veya AirPlay 'de bir işleme sahip olması), bu işlemi gerçekleştirmek için platforma özgü kod gerekir ve Xamarin. Forms 'un doğrudan desteklenen bir özelliği değildir.
Görünümler
Her iki çerçeve için de görsel hiyerarşi benzerdir. , WYSıWYG belgelerinin desteğiyle birlikte WPF biraz daha ayrıntılı bir şekilde yapılır.
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, birincil olarak mobil senaryolara yöneliktir. Bu nedenle, Kullanıcı bunlarla etkileşime geçtiğinde uygulamalar etkinleştirilir, askıyaalınır ve yeniden etkinleştirilir . Bu, bir WPF uygulamasında konumundan uzağa tıklanmaya benzerdir Window ve bu davranışı izlemek için geçersiz kılabileceğiniz veya üzerine bir dizi yöntem ve ilgili olay vardır.
| Amaç | WPF yöntemi | Xamarin. Forms yöntemi |
|---|---|---|
| İlk etkinleştirme | ctor + Window. OnLoaded | ctor + Page. OnStart |
| Mekte | Window. IsVisibleChanged | Sayfa. görünen |
| Gizli | Window. IsVisibleChanged | Sayfa. Degörünme |
| Bekletme/kayıp odağı | Window. Ondevre dışı | Page. OnSleep |
| Etkinleştirildi/odak alındı | Window. OnActivated | Page. Onözgeçmişi |
| Kapatıldı | Window. OnClosing + Window. OnClosed | yok |
Her ikisi de alt denetimleri gizleme/gösterme, WPF 'de ise üçlü durum özelliği IsVisible (görünür, gizli ve daraltılmış) olarak desteklenir. Xamarin. Forms içinde, özelliği aracılığıyla yalnızca görünür veya gizli olur IsVisible .
Layout
Sayfa düzeni, WPF 'de gerçekleşen aynı 2 taramalı (ölçü/düzenleme) ile gerçekleşir. Xamarin. Forms sınıfında aşağıdaki yöntemleri geçersiz kılarak sayfa düzenine bağlayabilirsiniz Page :
| Yöntem | Amaç |
|---|---|
| Onchildmeasuregeçersiz kılındı | Bir alt öğenin tercih edilen boyutu değişti. |
| Onsizeayrılan | Sayfaya genişlik/yükseklik atandı. |
| LayoutChanged olayı | Sayfanın düzeni/boyutu değişti. |
Bugün çağrılan ve WPF içinde bulunan genel bir olay olmayan genel bir düzen olayı yoktur CompositionTarget.Rendering .
Ortak düzen özellikleri
WPF ve Xamarin. Forms Margin , bir öğe etrafındaki boşlukları denetlemek ve Padding bir öğe Margin aralığı denetlemek için desteklenir. Ayrıca, Xamarin. Forms düzen görünümlerinin çoğunun aralığı denetlemek için özellikleri vardır (örneğin, satır veya sütun).
Ayrıca, çoğu öğe, üst kapsayıcıda nasıl konumlandığını etkilemek için özelliklere sahiptir:
| WPF | Xamarin.Forms | Amaç |
|---|---|---|
| HorizontalAlignment | HorizontalOptions | Sol/orta/sağ/Esnetme seçenekleri |
| VerticalAlignment | VerticalOptions | Top/Center/Bottom/Esnetme seçenekleri |
Not
Bu özelliklerin gerçek yorumu üst kapsayıcıya göre değişir.
Düzen görünümleri
WPF ve Xamarin. Forms, alt öğeleri konumlandırmak için düzen denetimleri kullanır. Çoğu durumda bunlar, işlevsellik bakımından birbirlerine yakın bir şekilde yakınlardır.
| WPF | Xamarin.Forms | Düzen Stili |
|---|---|---|
| StackPanel | StackLayout | Soldan sağa veya üstten aşağıya sonsuz yığınlama |
| Kılavuz | Kılavuz | Tablo biçimi (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 ekli özellikler kullanılır.
İşleme
WPF ve Xamarin.Forms için işleme mekanikleri kökten farklıdır. WPF'de, doğrudan oluştursunuz denetimler içeriği ekranda piksellere işler. WPF bunu temsil etmek için iki nesne grafiği (ağaç)tutar. Mantıksal ağaç, kodda veya XAML'de tanımlandığı gibi denetimleri temsil eder ve görsel ağaç ise doğrudan görsel öğe tarafından (sanal çizim yöntemi aracılığıyla) ya da değiştirilebileceğiniz veya özelleştirilebileceğiniz XAML tanımlı bir XAML aracılığıyla ekranda gerçekleştirilen gerçek işlemeyi temsil eder. Görsel ağaç genellikle denetimlerin çevresinde kenarlıklar, örtülü içerik etiketleri gibi şeyleri içeren daha karmaşıktır. WPF, bu iki nesne grafiğini incelemek için bir dizi API ( LogicalTreeHelperVisualTreeHelper ve ) içerir.
Xamarin.Forms'da, içinde tanımladığınız denetimler Page yalnızca basit veri nesneleridir. Bunlar mantıksal ağaç gösterimine benzer, ancak hiçbir zaman içeriği kendi başına işlemez. Bunun yerine, öğelerin işlemesini etkileyen veri modelidir. Gerçek işleme, her denetim türüne eşlenen ayrı bir görsel işleyici kümesi tarafından yapılır. Bu işleyiciler, platforma özgü Xamarin.Forms derlemeleri tarafından platforma özgü projelerin her birsinde kaydedilir. Burada bir liste ekleyebilirsiniz. Xamarin.Forms, işleyiciyi değiştirmenin veya genişletmenin yanı sıra platform başına yerel işlemeyi etkilemek için kullanılmaktadır.
Mantıksal/Görsel Ağaç
Xamarin.Forms'da mantıksal ağacı adım adım takip etmek için açık API yoktur, ancak aynı bilgileri almak için Yansıma'yı kullanabilirsiniz. Örneğin, yansımalı mantıksal çocuk numaralandıran bir yöntem aşağıdaki şekildedir.
Grafikler
Xamarin.Forms, şekiller olarak adlandırılan ilkel öğeler çizmek için bir grafik sistemi içerir. Şekiller hakkında daha fazla bilgi için bkz. Xamarin.Forms Şekilleri. Buna ek olarak, platformlar arası 2D çizim elde etmek için SkiaSharp gibi 3. taraf kitaplıklar dahil olabilir.
Kaynaklar
WPF ve Xamarin.Forms'da hem kaynak kavramı hem de kaynak sözlükleri vardır. Herhangi bir nesne türünü bir anahtarla içine yer ve ardından değişmeyecek şeyler veya çalışma zamanında sözlükte değişecek şeyler ResourceDictionary{StaticResource} için {DynamicResource} arayabilirsiniz. Kullanım ve mekanikler tek bir farkla aynıdır: Xamarin.Forms özelliğine atamak için tanımlamanız gerekirken WPF bunu önceden oluşturur ve sizin ResourceDictionaryResources 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 de destekler ve kullanıcı arabirimini oluşturan Xamarin.Forms öğelerinin teması için kullanılabilir. Tetikleyicileri (özellik, olay ve veriler), aracılığıyla devralmayı ve BasedOn değerler için kaynak aramalarını destekler. Stiller öğelere özelliği aracılığıyla açıkça veya WPF gibi bir kaynak anahtarı belirterek örtülü Style olarak uygulanır.
Cihaz Stilleri
WPF, sistem renklerini, yazı tiplerini ve ölçümlerini değerler ve kaynak anahtarları şeklinde dikte etmek için önceden tanımlanmış özellikler kümesine (gibi bir statik sınıf kümesinde statik değerler olarak SystemColors depolanır) sahiptir. Xamarin.Forms benzerdir, ancak aynı şeyleri temsil eden bir Cihaz Stilleri kümesi tanımlar. Bu stiller çerçeve tarafından sağlanır ve çalışma zamanı ortamına göre değerlere ayarlanır (ör. erişilebilirlik).
WPF
<Label Text="Title" Foreground="{DynamicResource {x:Static SystemColors.DesktopBrushKey}}" />
Xamarin.Forms
<Label Text="Title" Style="{DynamicResource TitleStyle}" />