Bagikan melalui


atribut x:DeferLoadStrategy

Penting

Mulai Windows 10, versi 1703 (Pembaruan Kreator), x:DeferLoadStrategy digantikan oleh atribut x:Load. Penggunaan x:Load="False" setara dengan x:DeferLoadStrategy="Lazy", tetapi menyediakan kemampuan untuk membongkar UI jika diperlukan. Lihat atribut x:Load untuk informasi selengkapnya.

Anda dapat menggunakan x:DeferLoadStrategy="Lazy" untuk mengoptimalkan performa startup atau pembuatan pohon aplikasi XAML Anda. Saat Anda menggunakan x:DeferLoadStrategy="Lazy", pembuatan elemen dan turunannya tertunda, yang mengurangi waktu startup dan biaya memori. Ini berguna untuk mengurangi biaya elemen yang jarang ditampilkan atau kondisional. Elemen akan diwujudkan ketika dirujuk dari kode atau VisualStateManager.

Namun, pelacakan elemen yang ditangguhkan oleh kerangka kerja XAML menambahkan sekitar 600 byte ke penggunaan memori untuk setiap elemen yang terpengaruh. Semakin besar pohon elemen yang Anda tangguhkan, semakin banyak waktu mulai yang akan Anda hemat, tetapi dengan biaya jejak memori yang lebih besar. Oleh karena itu, dimungkinkan untuk menggunakan atribut ini secara berlebihan sejauh performa Anda menurun.

Penggunaan atribut XAML

<object x:DeferLoadStrategy="Lazy" .../>

Keterangan

Batasan untuk menggunakan x:DeferLoadStrategy adalah:

  • Anda harus menentukan x:Name untuk elemen , karena perlu ada cara untuk menemukan elemen nanti.
  • Anda hanya dapat menunda jenis yang berasal dari UIElement atau FlyoutBase.
  • Anda tidak dapat menunda elemen akar di Halaman, UserControl, atau DataTemplate.
  • Anda tidak dapat menugaskan elemen dalam ResourceDictionary.
  • Anda tidak dapat menangguhkan XAML longgar yang dimuat dengan XamlReader.Load.
  • Memindahkan elemen induk akan menghapus elemen apa pun yang belum direalisasikan.

Ada beberapa cara berbeda untuk mewujudkan elemen yang ditangguhkan:

  • Panggil FindName dengan nama yang Anda tentukan pada elemen .
  • Panggil GetTemplateChild dengan nama yang Anda tentukan pada elemen .
  • Di VisualState, gunakan animasi Setter atau Storyboard yang menargetkan elemen yang ditangguhkan.
  • Targetkan elemen yang ditangguhkan di Storyboard mana pun.
  • Gunakan pengikatan yang menargetkan elemen yang ditangguhkan.

CATATAN: Setelah instansiasi elemen dimulai, elemen dibuat pada utas UI, sehingga dapat menyebabkan UI gagap jika terlalu banyak dibuat sekaligus.

Setelah elemen yang ditangguhkan dibuat dengan salah satu cara yang tercantum sebelumnya, beberapa hal terjadi:

  • Peristiwa yang dimuat pada elemen dinaikkan.
  • Setiap pengikatan pada elemen dievaluasi.
  • Jika Anda telah mendaftar untuk menerima pemberitahuan perubahan properti pada properti yang berisi elemen yang ditangguhkan, pemberitahuan akan dinaikkan.

Anda dapat menumpuk elemen yang ditangguhkan, namun elemen tersebut harus diwujudkan dari elemen terluar.  Jika Anda mencoba mewujudkan elemen anak sebelum induk direalisasikan, pengecualian akan dinaikkan.

Biasanya, kami sarankan Anda menugaskan elemen yang tidak dapat dilihat di bingkai pertama. Pedoman yang baik untuk menemukan kandidat yang akan ditangguhkan adalah mencari elemen yang sedang dibuat dengan Visibilitas yang diciutkan. Selain itu, UI yang dipicu oleh interaksi pengguna adalah tempat yang baik untuk mencari elemen yang dapat Anda tangguhkan.

Waspadai elemen penangguhan dalam ListView, karena akan mengurangi waktu mulai Anda, tetapi juga dapat mengurangi performa panning Anda tergantung pada apa yang Anda buat. Jika Anda ingin meningkatkan performa panning, lihat dokumentasi ekstensi markup {x:Bind} dan atribut x:Phase .

Jika atribut x:Phase digunakan bersama dengan x:DeferLoadStrategy , ketika elemen atau pohon elemen direalisasikan, pengikatan diterapkan hingga dan termasuk fase saat ini. Fase yang ditentukan untuk x:Phase tidak memengaruhi atau mengontrol penundaan elemen. Saat item daftar didaur ulang sebagai bagian dari penggeseran, elemen yang direalisasikan bereaksi dengan cara yang sama seperti elemen aktif lainnya, dan pengikatan yang dikompilasi (pengikatan {x:Bind} ) diproses menggunakan aturan yang sama, termasuk phasing.

Pedoman umum adalah mengukur performa aplikasi sebelum dan sesudah untuk memastikan Anda mendapatkan performa yang Anda inginkan.

Contoh

<Grid x:Name="DeferredGrid" x:DeferLoadStrategy="Lazy">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="Auto" />
    </Grid.ColumnDefinitions>

    <Rectangle Height="100" Width="100" Fill="#F65314" Margin="0,0,4,4" />
    <Rectangle Height="100" Width="100" Fill="#7CBB00" Grid.Column="1" Margin="4,0,0,4" />
    <Rectangle Height="100" Width="100" Fill="#00A1F1" Grid.Row="1" Margin="0,4,4,0" />
    <Rectangle Height="100" Width="100" Fill="#FFBB00" Grid.Row="1" Grid.Column="1" Margin="4,4,0,0" />
</Grid>
<Button x:Name="RealizeElements" Content="Realize Elements" Click="RealizeElements_Click"/>
private void RealizeElements_Click(object sender, RoutedEventArgs e)
{
    // This will realize the deferred grid.
    this.FindName("DeferredGrid");
}