Uygulama Performansını Geliştirme Xamarin.Forms

Evolve 2016: Ile Uygulama Performansını İyileştirme Xamarin.Forms

Kötü uygulama performansı birçok şekilde kendini gösterir. Bir uygulamanın yanıt vermemeye başlamasına neden olabilir, yavaş kaydırmaya neden olabilir ve cihaz pil ömrünü azaltabilir. Ancak performansı iyileştirmek, yalnızca verimli kod uygulamaktan fazlasını içerir. Kullanıcının uygulama performansı deneyimi de dikkate alınmalıdır. Örneğin, işlemlerin kullanıcının diğer etkinlikleri gerçekleştirmesini engellemeden yürütülmesini sağlamak, kullanıcının deneyimini geliştirmeye yardımcı olabilir.

Uygulamaların performansını ve algılanan performansını Xamarin.Forms artırmaya yönelik birçok teknik vardır. Bu teknikler toplu olarak bir CPU tarafından gerçekleştirilen çalışma miktarını ve bir uygulama tarafından kullanılan bellek miktarını büyük ölçüde azaltabilir.

Not

Bu makaleyi okumadan önce, Xamarin platformu kullanılarak oluşturulan uygulamaların bellek kullanımını ve performansını geliştirmek için platforma özgü olmayan tekniklerin açıklandığı Platformlar Arası Performans makalesini okumalısınız.

XAML derleyicisini etkinleştirme

XAML isteğe bağlı olarak XAML derleyicisi (XAMLC) ile doğrudan ara dile (IL) derlenebilir. XAMLC birçok avantaj sunar:

  • XAML'de derleme zamanı denetimi gerçekleştirerek kullanıcıya hataları bildirir.
  • XAML öğeleri için bazı yük ve örnekleme süresini kaldırır.
  • Artık .xaml dosyalarını eklemeyerek son derlemenin dosya boyutunu azaltmaya yardımcı olur.

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

Derlenmiş bağlamaları kullanma

Derlenen bağlamalar, bağlama ifadelerini yansıma ile çalışma zamanında çözümlemek yerine derleme zamanında çözümleyerek uygulamalarda veri bağlama performansını Xamarin.Forms geliştirir. Bağlama ifadesi derlendiğinde, genellikle bağlamayı klasik bağlama kullanmaktan 8-20 kat daha hızlı çözümleyen derlenmiş kod oluşturur. Daha fazla bilgi için bkz . Derlenmiş Bağlamalar.

Gereksiz bağlamaları azaltma

Bağlamaları, statik olarak kolayca ayarlanabilen içerik için kullanmayın. Bağlamalar uygun maliyetli olmadığından bağlama yapılması gerekmeyen verileri bağlamanın bir avantajı yoktur. Örneğin, ayarın Button.Text = "Accept" "Accept" değerine sahip bir viewmodel string özelliğine bağlamadan Button.Text daha az ek yükü vardır.

Hızlı işleyicileri kullanma

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

4.0'dan Xamarin.Forms itibaren hedef alan FormsAppCompatActivity tüm uygulamalar varsayılan olarak hızlı işleyiciler kullanır. Daha fazla bilgi için bkz . Hızlı oluşturucular.

Android'de başlatma izlemeyi etkinleştirme

Android'de Önceden (AOT) derlemesi, ç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 derlemesine kıyasla Android APK boyutu ve başlangıç süresi arasında bir denge sağlayan başlangıç izlemesini kullanmaktır.

Başlatma izleme, uygulamanın mümkün olduğunca çoğunu yönetilmeyen koda derlemek yerine, yalnızca boş Xamarin.Forms bir uygulamada uygulama başlatmanın en pahalı bölümlerini temsil eden yönetilen yöntemler kümesini derler. Bu yaklaşım, geleneksel AOT derlemesine kıyasla apk boyutunun azalmasına neden olurken, benzer başlatma iyileştirmeleri sağlar.

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

Düzen sıkıştırma, sayfa işleme performansını geliştirmek amacıyla görsel ağaçtan belirtilen düzenleri kaldırır. Bunun sağladığı performans avantajı, bir sayfanın karmaşıklığı, kullanılan işletim sisteminin sürümü ve uygulamanın çalıştığı cihaza bağlı olarak değişir. Ancak en büyük performans kazanımları eski cihazlarda da görülecektir. Daha fazla bilgi için bkz . Düzen Sıkıştırma.

Doğru düzeni seçin

Birden çok alt öğe görüntüleyebilen ancak yalnızca tek bir alt öğesi olan bir düzen boşa harcanmıştır. Örneğin, aşağıdaki kod örneğinde tek bir alt öğesi olan bir StackLayout gösterilmektedir:

<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 boş bir işlemdir ve StackLayout 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, gereksiz düzen hesaplamalarının yapılmasına neden olduğundan, diğer düzenlerin birleşimlerini kullanarak belirli bir düzenin görünümünü yeniden oluşturmayı denemeyin. Örneğin, örneklerin birleşimini StackLayout kullanarak düzeni Grid yeniden oluşturmayı denemeyin. Aşağıdaki kod örneği, bu hatalı 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ı yapıldığından bu gereksizdir. Bunun yerine, aşağıdaki kod örneğinde gösterildiği gibi istenen düzen kullanılarak Griddaha iyi 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:

  • Özellik değerlerini belirterek Margin düzen hiyerarşilerinin derinliğini azaltın ve daha az kaydırma görünümüne sahip düzenlerin oluşturulmasına olanak tanıyın. Daha fazla bilgi için bkz . Kenar Boşlukları ve Doldurma.
  • kullanırken Grid, mümkün olduğunca az satır ve sütunun boyuta Auto ayarlandığından emin olmaya çalışın. Otomatik boyutlandırılmış her satır veya sütun, düzen altyapısının ek düzen hesaplamaları gerçekleştirmesine neden olur. Bunun yerine, mümkünse sabit boyutlu satırlar ve sütunlar kullanın. Alternatif olarak, üst ağacın bu düzen yönergelerine uyması koşuluyla, satır ve sütunları numaralandırma değeriyle GridUnitType.Star orantılı miktarda alan kaplar.
  • Gerekmedikçe düzenin VerticalOptions ve HorizontalOptions özelliklerini ayarlamayın. varsayılan değerleri LayoutOptions.Fill ve LayoutOptions.FillAndExpand en iyi düzen iyileştirmesine izin verir. Bu özellikleri değiştirmenin bir maliyeti vardır ve bunları varsayılan değerlere ayarlarken bile bellek tüketir.
  • Mümkün olduğunda kullanmaktan RelativeLayout kaçının. Bu, CPU'ya önemli ölçüde daha fazla çalışma yapılmasına neden olur.
  • kullanırken AbsoluteLayoutmümkün olduğunca özelliğini kullanmaktan AbsoluteLayout.AutoSize kaçının.
  • kullanırken StackLayout, yalnızca bir alt öğesinin olarak LayoutOptions.Expandsayarlandığından emin olun. Bu özellik, belirtilen alt öğeye verebileceği en büyük alanı StackLayout kaplamasını sağlar ve bu hesaplamaları birden çok kez yapmak boşa harcanabilir.
  • Pahalı düzen hesaplamalarının yapılmasıyla Layout sonuçlandığı için sınıfının yöntemlerinden herhangi birini çağırmaktan kaçının. Bunun yerine, ve özellikleri ayarlanarak TranslationX TranslationY istenen düzen davranışı elde edilebilir. Alternatif olarak, istenen düzen davranışını elde etmek için sınıfı alt sınıfa Layout<View> ekleyin.
  • Etiketin boyutunun değiştirilmesi ekran düzeninin tamamının yeniden hesaplanmasını sağlayabileceğinizden, hiçbir Label örneği gerekenden daha sık güncelleştirin.
  • Gerekli olmadıkça özelliğini ayarlamayın Label.VerticalTextAlignment .
  • LineBreakMode Mümkün olduğunda tüm Label örneklerin değerini olarak NoWrap ayarlayın.

Zaman uyumsuz programlama kullanma

Zaman uyumsuz programlama kullanılarak uygulamanızın genel yanıt hızı artırılabilir ve performans sorunları genellikle önlenebilir. .NET'te Görev Tabanlı Zaman Uyumsuz Desen (TAP), zaman uyumsuz işlemler için önerilen tasarım desenidir. Ancak, TAP'nin yanlış kullanılması, iyi performanssız uygulamalara neden olabilir. Bu nedenle, TAP kullanılırken aşağıdaki yönergelere uyulmalıdır.

Temel Bilgiler

  • Sabit listesi tarafından TaskStatus temsil edilen görev yaşam döngüsünü anlayın. Daha fazla bilgi için bkz . TaskStatus'un anlamı ve Görev durumu.

  • Task.WhenAll Bir dizi zaman uyumsuz işlem yerine birden çok zaman uyumsuz işlemin tamamlanmasını zaman uyumsuz olarak await beklemek için yöntemini kullanın. Daha fazla bilgi için bkz . Task.WhenAll.

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

  • Belirtilen süreden Task.Delay sonra biten bir Task nesne oluşturmak için yöntemini kullanın. Bu, verileri yoklama ve kullanıcı girişini önceden belirlenmiş bir süre boyunca işlemeyi 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 yürütür Task.Run . Bu yöntem, en uygun bağımsız değişkenlerin TaskFactory.StartNew ayarlandığı yöntem için bir kısayoldur. Daha fazla bilgi için bkz . Task.Run.

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

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

  • Nesneleri oluşturarak TAP kullanmayan mevcut zaman uyumsuz işlemler için bir görev sarmalayıcı oluşturun TaskCompletionSource<T> . Bu nesneler programlamanın Task avantajlarını elde eder ve ilişkili Tasköğesinin ömrünü ve tamamlanmasını denetlemenizi sağlar. Daha fazla bilgi için bkz . TaskCompletionSource'un Doğası.

  • Zaman uyumsuz bir Task işlemin sonucunu işlemeye gerek kalmadığında, beklenen Task bir nesneyi döndürmek yerine bir nesne döndürür. Daha az bağlam geçişi yapıldığından bu daha yüksek performans gösterir.

  • Kullanılabilir olduğunda verileri işleme gibi senaryolarda veya birbiriyle zaman uyumsuz olarak iletişim kurması gereken birden çok işleminiz olduğunda Görev Paralel Kitaplığı (TPL) Veri Akışı kitaplığını kullanın. Daha fazla bilgi için bkz . Veri Akışı (Görev Paralel Kitaplığı).

Kullanıcı arabirimi

  • Varsa API'nin zaman uyumsuz bir sürümünü çağırın. Bu, kullanıcı arabirimi iş parçacığının engelini kaldırmasını sağlar ve bu da kullanıcının uygulama deneyimini iyileştirmeye yardımcı olur.

  • Özel durumların oluşmasını önlemek için ui öğelerini kullanıcı arabirimi iş parçacığındaki zaman uyumsuz işlemlerden alınan verilerle güncelleştirin. Ancak özelliğindeki ListView.ItemsSource güncelleştirmeler otomatik olarak kullanıcı arabirimi iş parçacığına sıralanır. Ui 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üncelleştirilen 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 atılan işlenmeyen özel durumlar, belirli senaryolar dışında çağrılan 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 async void kaçının ve bunun yerine yöntemler oluşturun async Task . Bunlar daha kolay hata işleme, birlenebilirlik ve test edilebilirlik sağlar. Bu yönergenin istisnası, döndürmesi voidgereken zaman uyumsuz olay işleyicileridir. Daha fazla bilgi için bkz . Zaman Uyumsuz Boşluktan Kaçınma.
  • Kilitlenmeye neden olabileceğinden, engelleme ve zaman uyumsuz kodu , Task.Resultveya GetAwaiter().GetResult yöntemlerini çağırarak Task.Waitkarıştırmayın. Ancak, bu yönergenin ihlal edilmesi gerekiyorsa, tercih edilen yaklaşım, görev özel durumlarını koruduğundan GetAwaiter().GetResult yöntemini çağırmaktır. Daha fazla bilgi için bkz. .NET 4.5'te Async All the Way ve Task Exception Handling.
  • ConfigureAwait Bağlamsız kod oluşturmak için mümkün olduğunda yöntemini kullanın. Bağlamsız kod, mobil uygulamalar için daha iyi performansa sahiptir ve kısmen zaman uyumsuz bir kod tabanıyla çalışırken kilitlenmeyi önlemeye yönelik kullanışlı bir tekniktir. Daha fazla bilgi için bkz . Bağlamı Yapılandırma.
  • Önceki zaman uyumsuz işlem tarafından oluşan özel durumları işleme ve başlamadan önce veya çalışırken bir devamlılığı 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.
  • 'den ICommandzaman uyumsuz ICommand işlemler çağrıldığında zaman uyumsuz bir uygulama kullanın. 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ı için Desenler: Komutlar.

Bağımlılık ekleme kapsayıcısı seçme

Bağımlılık ekleme kapsayıcıları, mobil uygulamalara ek performans kısıtlamaları ekler. Kapsayıcıya türleri kaydetme ve çözmenin, özellikle uygulamadaki her sayfa gezintisi için bağımlılıkların yeniden oluşturulması durumunda kapsayıcının her türü oluşturmak için yansıma kullanması nedeniyle performans maliyeti vardır. Çok veya derin bağımlılıklar varsa oluşturma maliyeti önemli ölçüde artabilir. Ayrıca, genellikle uygulama başlatma sırasında gerçekleşen tür kaydı, kullanılan kapsayıcıya bağlı olarak başlatma süresi üzerinde belirgin bir etkiye sahip olabilir.

Alternatif olarak, bağımlılık ekleme, fabrikalar kullanılarak el ile uygulanarak daha performanslı hale getirilebilir.

Kabuk uygulamaları oluşturma

Xamarin.Forms Kabuk uygulamaları, açılır menülere ve sekmelere dayalı olarak fikir temelli bir gezinti deneyimi sağlar. Uygulama kullanıcı deneyiminiz Shell ile uygulanabiliyorsa, bunu yapmak yararlı olur. Kabuk uygulamaları kötü bir başlangıç deneyiminden kaçınmaya yardımcı olur, çünkü sayfalar 'TabbedPage' kullanan uygulamalarda oluşan uygulama başlangıcında değil, gezintiye yanıt olarak isteğe bağlı olarak oluşturulur. Daha fazla bilgi için bkz Xamarin.Forms . Shell.

ListView yerine CollectionView kullanma

CollectionView , farklı düzen belirtimlerini kullanarak veri listelerini sunmaya yönelik bir görünümdür. için daha esnek ve performanslı bir alternatif ListViewsağlar. Daha fazla bilgi için bkz Xamarin.Forms . CollectionView.

ListView performansını iyileştirme

kullanırken ListViewiyileştirilmiş olması gereken bir dizi kullanıcı deneyimi vardır:

  • Başlatma : Denetim oluşturulduğunda başlayan ve öğeler ekranda gösterildiğinde biten zaman aralığı.
  • Kaydırma : Listede gezinme ve kullanıcı arabiriminin dokunma hareketlerinin gerisinde kalmadığından emin olma özelliği.
  • Öğeleri ekleme, silme ve seçme etkileşimi.

Denetim ListView , bir uygulamanın veri ve hücre şablonları sağlamasını gerektirir. Bunun nasıl başarılacağı, 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ın görüntülenmesi, uygulamanın bellek ayak izini büyük ölçüde artırabilir. Bu nedenle, bunlar yalnızca gerekli olduğunda oluşturulmalı ve uygulama artık bunları gerektirmediği anda serbest bırakılmalıdır. Örneğin, bir uygulama bir akıştan verilerini okuyarak görüntü görüntülüyorsa, akışın yalnızca gerekli olduğunda oluşturulduğundan emin olun ve artık gerekli olmadığında akışın yayınlandığından emin olun. Bu, sayfa oluşturulduğunda veya olay tetiklendiğinde Page.Appearing akışı oluşturup olay tetiklendiğinde akışın yok edilmesiyle Page.Disappearing gerçekleştirilebilir.

yöntemiyle ImageSource.FromUri görüntü için bir görüntü indirirken, özelliğin olarak ayarlandığından UriImageSource.CachingEnabled emin olarak indirilen görüntüyü önbelleğe alın true. Daha fazla bilgi için bkz . Görüntülerle Çalışma.

Daha fazla bilgi için bkz . Görüntü Kaynaklarını İyileştirme.

Görsel ağaç boyutunu küçültme

Sayfadaki öğe sayısını azaltmak, sayfanın daha hızlı işlenmesini sağlar. Bunu başarmak için iki ana teknik vardır. İlki, görünür olmayan öğeleri gizlemektir. IsVisible Her öğenin özelliği, öğenin görsel ağacın parçası olup olmayacağını belirler. Bu nedenle, bir öğe diğer öğelerin arkasına gizlendiği için görünür değilse, öğesini kaldırın veya özelliğini olarak falseayarlayınIsVisible.

İkinci teknik, gereksiz öğeleri kaldırmaktır. Örneğin, aşağıdaki kod örneği birden çok Label nesne içeren bir sayfa düzenini gösterir:

<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 azaltılmış öğ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ük boyutunu küçültme

Uygulama genelinde kullanılan tüm kaynaklar, yinelenenleri önlemek için uygulamanın kaynak sözlüğünde depolanmalıdır. Bu, uygulama genelinde ayrıştırılması gereken XAML miktarını azaltmaya yardımcı olur. Aşağıdaki kod örneği, uygulama genelinde kullanılan ve uygulamanın kaynak sözlüğünde tanımlanan kaynağı gösterir HeadingLabelStyle :

<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, çünkü kaynaklar bir sayfa için gerekli olduğunda değil, uygulama başlangıcında ayrıştırılır. Bir kaynak başlangıç sayfası olmayan bir sayfa tarafından kullanılıyorsa, bu sayfanın kaynak sözlüğüne yerleştirilmelidir, bu nedenle uygulama başlatıldığında ayrıştırılan XAML'nin azaltılmasına yardımcı olur. Aşağıdaki kod örneği, yalnızca tek bir sayfada yer alan ve sayfanın kaynak sözlüğünde tanımlanan kaynağı gösterir HeadingLabelStyle :

<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 desenini kullanma

Çoğu Xamarin.Forms işleyici sınıfı, karşılık gelen yerel denetimi işlemek için özel bir Xamarin.Forms denetim oluşturulduğunda çağrılan yöntemini kullanıma sunarOnElementChanged. Her platform projesinde özel işleyici sınıfları, yerel denetimin örneğini oluşturmak ve özelleştirmek için bu yöntemi geçersiz kılar. SetNativeControl yöntemi, yerel denetimin örneğini almak için kullanılır ve bu yöntem de denetim başvuruyu özelliğine Control atar.

Ancak, bazı durumlarda OnElementChanged yöntemi birden çok kez çağrılabilir. Bu nedenle, performansı etkileyebilecek bellek sızıntılarını önlemek için yeni bir yerel denetim örneği oluştururken dikkatli olunmalıdır. Özel işleyicide yeni bir yerel denetimin örneğini oluştururken kullanılacak yaklaşım aşağıdaki kod örneğinde gösterilmiştir:

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

Özelliği olduğunda Control null, yeni bir yerel denetim yalnızca bir kez örneklenmelidir. Buna ek olarak, denetim yalnızca özel işleyici yeni Xamarin.Forms bir öğeye eklendiğinde abone olunan olay işleyicileri oluşturulmalıdır. Benzer şekilde, abone olunan tüm olay işleyicilerinin aboneliği yalnızca işleyicinin değişikliklere eklendiği öğeden kaldırılmalıdır. Bu yaklaşımı benimsemek, bellek sızıntılarından muzdarip olmayan verimli bir şekilde performans gösteren özel işleyici oluşturmaya yardımcı olur.

Önemli

SetNativeControl yöntemi yalnızca özelliği değilse nullve Control özelliği ise nullçağrılmalıdıre.NewElement.

Özel işleyiciler hakkında daha fazla bilgi için bkz . Her Platformdaki Denetimleri Özelleştirme.