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}" />