Aracılığıyla paylaş


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

  • iOSMain method > AppDelegate > App > ContentPage
  • AndroidMainActivity > App > ContentPage
  • UWPMain 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 UIWindowolur. 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 GridSplitterdesteklemez.

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 ResourceDictionarybir ç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 BasedOndevralmayı 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 SystemColorsdepolanı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}" />