Uygulama Xamarin.Forms Performansını Geliştirme

Evolve 2016: Ile Uygulama Performansını Iyileştirme

Zayıf uygulama performansı birçok şekilde kendini gösterir. Bir uygulamanın yanıt vermiyor gibi görünmelerini, yavaş kaydırmaya neden olabilir ve cihazın pil ömrünü kısaltabilirsiniz. Ancak, performansın en iyi duruma getirileme işlemi yalnızca verimli kod uygulamaktan fazlasını gerektirir. Kullanıcının uygulama performansı deneyimi de dikkate alınmalıdır. Örneğin, işlemlerin kullanıcının başka etkinlikler gerçekleştirmesini engellemeden yürütmesini sağlamak, kullanıcının deneyimini geliştirmeye yardımcı olabilir.

Uygulamaların performansını ve algılanan performansını artırmaya yönelik birçok teknik Xamarin.Forms vardır. Bu teknikler topluca CPU tarafından gerçekleştirilen iş miktarını ve bir uygulama tarafından tüketilen bellek miktarını önemli ölçüde azaltabilirsiniz.

Not

Bu makaleyi okumadan önce Xamarin platformukullanılarak geliştirilmiş uygulamaların bellek kullanımını ve performansını geliştirmeye yönelik platformlara özgü olmayan teknikleri ele alan Platformlar Arası Performans'ı okumanız gerekir.

XAML derleyiciyi etkinleştirme

XAML isteğe bağlı olarak XAML derleyicisi (XAMLC) ile doğrudan ara dile (IL) derlenmiş olabilir. XAMLC bir dizi avantaj sunar:

  • XAML'nin derleme zamanı denetimi gerçekleştirerek kullanıcıya hataları bildiriyor.
  • XAML öğeleri için bazı yükleme ve örnekleme sürelerini kaldırır.
  • Artık .xaml dosyalarını dahil etmek zorunda kalmadan son derlemenin dosya boyutunu azaltmaya yardımcı olur.

XAMLC, yeni çözümlerde varsayılan olarak Xamarin.Forms etkindir. Ancak, eski çözümlerde etkinleştirilmesi gerektirilebilir. Daha fazla bilgi için bkz. XAML Derleme.

Derlenmiş bağlamaları kullanma

Derlenmiş bağlamalar, bağlama ifadelerini yansımalı çalışma zamanında değil derleme zamanında çözümleerek uygulamalarda Xamarin.Forms veri bağlama performansını artırır. Bağlama ifadesini derlemek, genellikle bir bağlamayı klasik bağlama kullanmaya göre 8-20 kat hızlı çözümleten derlenmiş kod üretir. Daha fazla bilgi için bkz. Derlenmiş Bağlamalar.

Gereksiz bağlamaları azaltma

Kolayca statik olarak ayarlanabiliyor içerik için bağlamaları kullanmayın. Bağlamalar uygun maliyetli olduğundan bağlama verilerine bağlanmanın bir avantajı yoktur. Örneğin, ayarın Button.Text = "Accept"Button.Text = "Accept" "Accept" Xamarin_Forms _Button_Text" data-linktype="absolute-path">viewmodel özelliğine bağlama yükü daha Button.Textstring azdır.

Hızlı işleyicileri kullanma

Hızlı işleyiciler, sonuçta elde edilen yerel denetim hiyerarşisini düz hale kullanarak Android'de denetimlerin Xamarin.Forms düşük ve işleme maliyetlerini azaltır. Bu da daha az nesne oluşturarak performansı artırır ve bu da daha az karmaşık bir görsel ağacına ve daha az bellek kullanımına neden olur.

Xamarin.Forms4.0'dan itibaren tüm uygulamaları hedefleme varsayılan FormsAppCompatActivity olarak hızlı işleyicileri kullanır. Daha fazla bilgi için bkz. Hızlı Oluşturucular.

Android'de başlangıç izlemeyi etkinleştirme

Android'de Zamanından Önce (AOT) derleme, çok daha büyük bir APK oluşturma maliyetiyle Tam Zamanında (JIT) uygulama başlatma ek yükünü ve bellek kullanımını en aza indirir. Alternatif olarak, geleneksel AOT derlemesi ile karşılaştırıldığında Android APK boyutu ile başlangıç süresi arasında bir takas sağlayan başlangıç izlemesi kullanılabilir.

Yönetilemeyen kod için uygulamanın mümkün olduğunca çoğunu derlemek yerine, başlangıç izlemesi yalnızca boş bir uygulamada uygulama başlatmanın en pahalı bölümlerini temsil eden yönetilen yöntemler kümesi Xamarin.Forms derler. Bu yaklaşım geleneksel AOT derlemesi ile karşılaştırıldığında APK boyutunun azalmasına ve benzer başlatma geliştirmeleri sağlanmasına neden olur.

Düzen sıkıştırmayı etkinleştirme

Düzen sıkıştırma, sayfa işleme performansını artırmak için görsel ağaçtan belirtilen düzenleri kaldırır. Bunun sun olduğu performans avantajı, sayfanın karmaşıklığına, kullanılan işletim sisteminin sürümüne ve uygulamanın üzerinde çalıştır olduğu cihaza bağlı olarak değişir. Ancak, en büyük performans kazancı eski cihazlarda görülür. Daha fazla bilgi için bkz. Düzen Sıkıştırma.

Doğru düzeni seçme

Birden çok alt dosya görüntüleme özelliğine sahip olan ancak yalnızca tek bir alt aya sahip olan bir düzen, boşa harcanabilen bir düzendir. Örneğin, aşağıdaki kod örneğinde tek bir StackLayout alta sahip bir yer gösterir:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="DisplayImage.HomePage">
    <StackLayout>
        <Image Source="waterfront.jpg" />
    </StackLayout>
</ContentPage>

Bu çok israftır StackLayout ve aşağıdaki kod örneğinde gösterildiği gibi öğesi kaldırılmalıdır:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="DisplayImage.HomePage">
    <Image Source="waterfront.jpg" />
</ContentPage>

Ayrıca, diğer düzenlerin birleşimlerini kullanarak belirli bir düzenin görünümünü yeniden oluşturmaya çalışmayın çünkü bu, gereksiz düzen hesaplamalarının gerçekleştiriliyor olmasıyla sonuçlanmıştır. Örneğin, örneklerin bir bileşimini Grid kullanarak düzeni yeniden oluşturmaya StackLayout kalkışma. Aşağıdaki kod örneği bu kötü uygulamanın bir örneğini gösterir:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="Details.HomePage"
             Padding="0,20,0,0">
    <StackLayout>
        <StackLayout Orientation="Horizontal">
            <Label Text="Name:" />
            <Entry Placeholder="Enter your name" />
        </StackLayout>
        <StackLayout Orientation="Horizontal">
            <Label Text="Age:" />
            <Entry Placeholder="Enter your age" />
        </StackLayout>
        <StackLayout Orientation="Horizontal">
            <Label Text="Occupation:" />
            <Entry Placeholder="Enter your occupation" />
        </StackLayout>
        <StackLayout Orientation="Horizontal">
            <Label Text="Address:" />
            <Entry Placeholder="Enter your address" />
        </StackLayout>
    </StackLayout>
</ContentPage>

Gereksiz düzen hesaplamaları gerçekleştirilen için bu gereksiz bir işlemdir. Bunun yerine, aşağıdaki kod örneğinde gösterildiği gibi Grid istenen düzen kullanılarak daha iyi bir şekilde elde edilebilir:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="Details.HomePage"
             Padding="0,20,0,0">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="100" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="30" />
            <RowDefinition Height="30" />
            <RowDefinition Height="30" />
            <RowDefinition Height="30" />
        </Grid.RowDefinitions>
        <Label Text="Name:" />
        <Entry Grid.Column="1" Placeholder="Enter your name" />
        <Label Grid.Row="1" Text="Age:" />
        <Entry Grid.Row="1" Grid.Column="1" Placeholder="Enter your age" />
        <Label Grid.Row="2" Text="Occupation:" />
        <Entry Grid.Row="2" Grid.Column="1" Placeholder="Enter your occupation" />
        <Label Grid.Row="3" Text="Address:" />
        <Entry Grid.Row="3" Grid.Column="1" Placeholder="Enter your address" />
    </Grid>
</ContentPage>

Düzen performansını iyileştirme

Mümkün olan en iyi düzen performansını elde etmek için şu yönergeleri izleyin:

Zaman uyumsuz programlama kullanma

Zaman uyumsuz programlama kullanarak, uygulamanıza genel yanıt verme hızı geliştirebilir ve performans sorunları genellikle önlenmiş olur. .NET'te Görev Tabanlı Zaman Uyumsuz Desen (TAP), zaman uyumsuz işlemler için önerilen tasarım desenidir. Ancak TAP'ın yanlış kullanımı, performanssız uygulamalara neden olabilir. Bu nedenle, TAP kullanırken aşağıdaki yönergelere uyması gerekir.

Temel Bilgiler

  • Numaralama ile temsil edilen görev yaşam döngüsünü TaskStatus anlama. Daha fazla bilgi için bkz. TaskStatus'un anlamı ve Görev durumu.

  • Tek tek bir dizi zaman uyumsuz işlem yerine, birden çok zaman uyumsuz işlemlerin tamam beklenişini zaman uyumsuz olarak beklemek Task.WhenAllawait için yöntemini kullanın. Daha fazla bilgi için bkz. Task.WhenAll.

  • Birden Task.WhenAny çok zaman uyumsuz işlemden birinin bitimini zaman uyumsuz olarak beklemek için yöntemini kullanın. Daha fazla bilgi için bkz. Task.WhenAny.

  • Belirtilen Task.Delay sürenin ardından Task bitirilen bir nesne üretmek için yöntemini kullanın. Bu, verileri yoklama ve kullanıcı girişinin işlenmesini önceden belirlenemeyen bir süre geciktirme gibi senaryolar için kullanışlıdır. Daha fazla bilgi için bkz. Task.Delay.

  • yöntemiyle iş parçacığı havuzunda yoğun zaman uyumlu CPU işlemleri Task.Run yürütün. Bu yöntem, en uygun bağımsız TaskFactory.StartNew değişkenler ayarlanmış şekilde yöntemi için bir kısayol sağlar. Daha fazla bilgi için bkz. Task.Run.

  • Zaman uyumsuz oluşturucular oluşturmaktan kaçının. Bunun yerine, başlatmayı doğru şekilde yapmak için yaşam döngüsü olaylarını veya await ayrı başlatma mantığını kullanın. Daha fazla bilgi için bkz. Zaman Uyumsuz Oluşturucular blog.stephencleary.com.

  • Uygulama başlatma sırasında zaman uyumsuz işlemlerin tamamlandıktan sonra beklememek için yavaş görev desenini kullanın. Daha fazla bilgi için bkz. AsyncLazy.

  • Nesneleri oluşturarak dokunarak, mevcut zaman uyumsuz işlemler için bir görev sarmalayıcısı oluşturun TaskCompletionSource<T> . Bu nesneler, programlama avantajlarından yararlanır Task ve ilişkili öğesinin yaşam süresini ve tamamlanmasını denetlemenizi sağlar Task . Daha fazla bilgi için bkz. TaskCompletionSource yapısı.

  • Bir TaskTask zaman uyumsuz işlemin sonucunu işlemeye gerek olmadığında, bir abeklemiş nesne döndürmek yerine bir nesne döndürün. Bu, daha az bağlam geçişinin gerçekleştirilmesi nedeniyle daha fazla performanhı.

  • Görev paralel kitaplığı (TPL) veri akışı kitaplığını, kullanılabilir hale geldiğinde verileri işleme veya birbirleriyle zaman uyumsuz olarak iletişim kurması gereken birden çok işlem olduğu durumlarda kullanın. Daha fazla bilgi için bkz. dataflow (görev paralel kitaplığı).

Kullanıcı arabirimi

  • Varsa, bir API 'nin zaman uyumsuz bir sürümünü çağırın. Bu, kullanıcının uygulamayla ilgili deneyiminin iyileştirilmesine yardımcı olacak kullanıcı ARABIRIMI iş parçacığını engellenmemiş olarak tutacaktır.

  • Özel durumların oluşmasını önlemek için UI öğelerini Kullanıcı arabirimi iş parçacığında zaman uyumsuz işlemlerden alınan verilerle güncelleştirin. Ancak, ListView.ItemsSource özellik güncelleştirmeleri otomatik olarak Kullanıcı arabirimi iş parçacığına sıralanır. Kullanıcı arabirimi iş parçacığında kodun çalışıp çalışmadığını belirleme hakkında bilgi için bkz Xamarin.Essentials: MainThread ..

    Önemli

    Veri bağlama aracılığıyla güncellenen tüm denetim özellikleri otomatik olarak Kullanıcı arabirimi iş parçacığına sıralanır.

Hata işleme

  • Zaman uyumsuz özel durum işleme hakkında bilgi edinin. Zaman uyumsuz olarak çalışan kod tarafından oluşturulan işlenmemiş özel durumlar, belirli senaryolar haricinde çağıran iş parçacığına geri yayılır. Daha fazla bilgi için bkz. özel durum işleme (görev paralel kitaplığı).
  • Yöntem oluşturmaktan kaçının async void ve bunun yerine async Task Yöntem oluşturun. Bu, daha kolay hata işleme, bileşim ve test edilebilirlik sağlar. Bu kılavuz için özel durum, dönmesi gereken zaman uyumsuz olay işleyicileridir void . Daha fazla bilgi için bkz. Async void kullanmaktan kaçının.
  • Engellemeyi ve zaman uyumsuz kodu Task.Wait ,, Task.Result veya yöntemlerini çağırarak, GetAwaiter().GetResult kilitlenmeyle sonuçlanabileceğinden karışmayın. Ancak, bu kılavuz çiğnenmelidir, ancak GetAwaiter().GetResult görev özel durumlarını koruyacağından tercih edilen yaklaşım yöntemi çağırmasıdır. Daha fazla bilgi için bkz. .NET 4,5 'de zaman uyumsuz tüm yollar ve görev özel durum işleme.
  • ConfigureAwaitBağlama ücretsiz kod oluşturmak için mümkün olan her durumda yöntemini kullanın. Bağlam dışı kod, mobil uygulamalar için daha iyi performansa sahiptir ve kısmen zaman uyumsuz kod temeli çalışırken kilitlenmeyi önlemeye yönelik yararlı bir tekniktir. Daha fazla bilgi için bkz. bağlamı yapılandırma.
  • Önceki zaman uyumsuz işlem tarafından oluşturulan özel durumları işleme ve başlamadan önce ya da çalışırken iptal etme gibi işlevler için devamlılık görevlerini kullanın. Daha fazla bilgi için bkz. sürekli görevleri kullanarak görevleri zincirleme.
  • ICommandİçinden zaman uyumsuz işlemler çağrıldığında zaman uyumsuz bir uygulama kullanın ICommand . Bu, zaman uyumsuz komut mantığındaki tüm özel durumların işlenebilmesini sağlar. Daha fazla bilgi için bkz. zaman uyumsuz programlama: zaman uyumsuz MVVM uygulamalarına yönelik desenler: komutlar.

Bağımlılık ekleme kapsayıcısını dikkatle seçin

Bağımlılık ekleme kapsayıcıları, mobil uygulamalara ek performans kısıtlamaları getirir. Türlerin bir kapsayıcı ile kaydedilmesi ve çözümlenmesi, özellikle uygulamadaki her bir sayfa gezintisi için bağımlılıklar yeniden oluşturulabileceğinden, kapsayıcının her tür oluşturmaya yönelik yansıma kullanımı nedeniyle performans maliyetine sahiptir. Çok sayıda veya derin bağımlılık varsa, oluşturma maliyeti önemli ölçüde artabilir. Buna ek olarak, genellikle uygulamanın başlatılması sırasında oluşan tür kaydı, kullanılan kapsayıcıya bağlı olarak başlangıç zamanı üzerinde belirgin bir etkiye sahip olabilir.

Alternatif olarak, bağımlılık ekleme, fabrika kullanarak el ile uygulayarak daha fazla performans verebilir.

Kabuk uygulamaları oluşturma

Xamarin.Forms Kabuk uygulamaları, flyolar ve sekmeler temelinde opmonklu bir gezinti deneyimi sağlar. Uygulama Kullanıcı deneyiminiz kabuğa uygulanabilmesi durumunda bunu yapmanız yararlı olur. Kabuk uygulamaları kötü bir başlangıç deneyiminden kaçınmaya yardımcı olur, çünkü bir ' Tabbedpage 'kullanan uygulamalarla oluşan uygulama başlangıcında olduğu gibi, gezinmeye yanıt olarak, sayfalar isteğe bağlı olarak oluşturulur. Daha fazla bilgi için bkz. Xamarin.Forms Shell.

ListView yerine CollectionView kullanın

CollectionView , farklı düzen belirtimleri kullanarak veri listeleri sunma görünümüdür. İçin daha esnek ve iyi bir alternatif sağlar ListView . Daha fazla bilgi için bkz. Xamarin.Forms CollectionView.

ListView performansını iyileştirme

Kullanırken ListView , en iyi duruma getirilmesi gereken birkaç kullanıcı deneyimi vardır:

  • Başlatma : denetim oluşturulduğunda başlangıç zaman aralığı ve öğeler ekranda gösterildiğinde sona eriyor.
  • Kaydırma : listede kaydırma yapma ve Kullanıcı arabiriminin dokunma hareketlerinden sonra gecikme olmadığından emin olun.
  • Öğeleri ekleme, silme ve seçme etkileşimi .

ListViewDenetim, bir uygulamanın veri ve hücre şablonları sağlaması için gereklidir. Bunun nasıl elde edildiği, denetimin performansı üzerinde büyük bir etkiye sahip olacaktır. Daha fazla bilgi için bkz. ListView performansı.

Görüntü kaynaklarını iyileştirme

Görüntü kaynaklarını görüntülemek, bir uygulamanın bellek parmak izini büyük ölçüde artırabilir. Bu nedenle, yalnızca gerektiğinde oluşturulmaları ve uygulama artık gerekli değildir almaz serbest bırakılması gerekir. Örneğin, bir uygulama bir akıştan verilerini okuyarak bir görüntü görüntülüyor ise akışın yalnızca gerekli olduğunda oluşturulduğundan emin olun ve artık gerekli olmadığında akışın serbest olduğundan emin olun. Bu, sayfa oluşturulduğunda ya da Page.Appearing olay tetiklendiğinde, sonra da olay tetiklendiğinde akışı elden atılırken akış oluşturularak elde edilebilir Page.Disappearing .

Xamarin_Forms _ImageSource_FromUri_System_Uri_ "Data-LinkType =" Absolute-path ">yöntemi ile görüntülenmek üzere bir görüntü indirilirken ImageSource.FromUri , Xamarin_Forms ImageSource.FromUri _UriImageSource_CachingEnabled" Data-LinkType = "Absolute-path" >UriImageSource.CachingEnabled özelliğinin olarak ayarlandığını sağlayarak indirilen görüntüyü önbelleğe alma true . Daha fazla bilgi için bkz. görüntülerle çalışma.

Daha fazla bilgi için bkz. görüntü kaynaklarını iyileştirme.

Görsel ağaç boyutunu küçültün

Sayfadaki öğelerin sayısını azaltmak sayfa işlemesini daha hızlı hale getirir. Bunu elde etmek için iki ana teknik vardır. Birincisi, görünür olmayan öğeleri gizlemedir. Xamarin_Forms _VisualElement_IsVisible "Data-LinkType =" Absolute-path ">IsVisible özelliği, öğenin görsel ağacın bir parçası olup olmayacağını belirler. Bu nedenle, diğer öğelerin arkasına gizlenmiş olduğundan bir öğe görünür değilse, öğeyi kaldırın ya da IsVisible özelliğini olarak ayarlayın false .

İkinci yöntem, gereksiz öğeleri kaldırmak için kullanılır. Örneğin, aşağıdaki kod örneği birden çok nesne içeren bir sayfa düzeni göstermektedir Label :

<StackLayout>
    <StackLayout Padding="20,20,0,0">
        <Label Text="Hello" />
    </StackLayout>
    <StackLayout Padding="20,20,0,0">
        <Label Text="Welcome to the App!" />
    </StackLayout>
    <StackLayout Padding="20,20,0,0">
        <Label Text="Downloading Data..." />
    </StackLayout>
</StackLayout>

Aşağıdaki kod örneğinde gösterildiği gibi, aynı sayfa düzeni daha düşük bir öğe sayısıyla korunabilir:

<StackLayout Padding="20,35,20,20" Spacing="25">
  <Label Text="Hello" />
  <Label Text="Welcome to the App!" />
  <Label Text="Downloading Data..." />
</StackLayout>

Uygulama kaynağı sözlüğü boyutunu azaltın

Çoğaltma önlemek için uygulama genelinde kullanılan kaynakların uygulamanın kaynak sözlüğünde depolanması gerekir. Bu, uygulama genelinde ayrıştırılması gereken XAML miktarını azaltmaya yardımcı olur. Aşağıdaki kod örneğinde, HeadingLabelStyle uygulama genelinde kullanılan kaynak gösterilmektedir ve bu nedenle uygulamanın kaynak sözlüğünde tanımlanmıştır:

<Application xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="Resources.App">
     <Application.Resources>
         <ResourceDictionary>
            <Style x:Key="HeadingLabelStyle" TargetType="Label">
                <Setter Property="HorizontalOptions" Value="Center" />
                <Setter Property="FontSize" Value="Large" />
                <Setter Property="TextColor" Value="Red" />
            </Style>
         </ResourceDictionary>
     </Application.Resources>
</Application>

Ancak, bir sayfaya özgü XAML, uygulamanın kaynak sözlüğüne dahil edilmemelidir, daha sonra kaynaklar bir sayfa için gerektiğinde uygulama başlangıcında ayrıştırılacaktır. Bir kaynak, başlangıç sayfası olmayan bir sayfa tarafından kullanılıyorsa, bu sayfanın kaynak sözlüğüne yerleştirilmesi gerekir, bu nedenle uygulama başlatıldığında ayrıştırılmış XAML 'yi azaltmaya yardımcı olur. Aşağıdaki kod örneği, HeadingLabelStyle yalnızca tek bir sayfada olan kaynağı gösterir ve bu nedenle sayfanın kaynak sözlüğünde tanımlanmıştır:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="Test.HomePage"
             Padding="0,20,0,0">
    <ContentPage.Resources>
        <ResourceDictionary>
          <Style x:Key="HeadingLabelStyle" TargetType="Label">
              <Setter Property="HorizontalOptions" Value="Center" />
              <Setter Property="FontSize" Value="Large" />
              <Setter Property="TextColor" Value="Red" />
          </Style>
        </ResourceDictionary>
    </ContentPage.Resources>
    ...
</ContentPage>

Uygulama kaynakları hakkında daha fazla bilgi için bkz. xaml stilleri.

Özel işleyici modelini kullanın

Çoğu Xamarin.Forms işleyici sınıfı OnElementChanged , Xamarin.Forms karşılık gelen yerel denetimi işlemek için özel bir denetim oluşturulduğunda çağrılan yöntemini sunar. Özel Oluşturucu sınıfları, her platform projesinde, yerel denetimi örneklemek ve özelleştirmek için bu yöntemi geçersiz kılar. SetNativeControlYöntemi, yerel denetimin örneğini oluşturmak için kullanılır ve bu yöntem, denetim başvurusunu özelliğine de atar Control .

Ancak bazı durumlarda OnElementChanged Yöntem birden çok kez çağrılabilir. Bu nedenle, performans etkisi olabilen bellek sızıntılarını engellemek için yeni bir yerel denetim örneği oluşturulurken dikkatli olunmalıdır. Özel bir işleyicide yeni bir yerel denetimin örneği oluşturulurken kullanılacak yaklaşım, aşağıdaki kod örneğinde gösterilmektedir:

protected override void OnElementChanged (ElementChangedEventArgs<NativeListView> e)
{
  base.OnElementChanged (e);

  if (e.OldElement != null)
  {
    // Unsubscribe from event handlers and cleanup any resources
  }

  if (e.NewElement != null)
  {
    if (Control == null)
    {
      // Instantiate the native control with the SetNativeControl method
    }
    // Configure the control and subscribe to event handlers
  }
}

Yeni bir yerel denetim, özelliği olduğunda yalnızca bir kez oluşturulmalıdır Controlnull . Ayrıca, özel Oluşturucu yeni bir öğeye eklendiğinde denetim yalnızca oluşturulmalı, yapılandırılmalıdır ve olay işleyicileri abone olmalıdır Xamarin.Forms . Benzer şekilde, abone olunan tüm olay işleyicileri yalnızca oluşturucunun değişikliklere eklendiği öğe olduğunda aboneliği kaldırılamaz. Bu yaklaşımı benimseme, bellek sızıntılarından etkilemeyen, etkin bir özel işleyici oluşturmaya yardımcı olur.

Önemli

SetNativeControlYöntemi yalnızca e.NewElement özelliği yoksa null ve Control özelliği ise çağrılmalıdır null .

Özel işleyiciler hakkında daha fazla bilgi için bkz. her platformda denetimleri özelleştirme.