x:Muat atribut

Anda dapat menggunakan x:Load untuk mengoptimalkan startup, pembuatan pohon visual, dan penggunaan memori aplikasi XAML Anda. Menggunakan x:Load memiliki efek visual yang sama dengan Visibilitas, kecuali bahwa ketika elemen tidak dimuat, memorinya dilepaskan dan secara internal tempat penampung kecil digunakan untuk menandai tempatnya di pohon visual.

Elemen UI yang dikaitkan dengan x:Load dapat dimuat dan dibongkar melalui kode, atau menggunakan ekspresi x:Bind . Ini berguna untuk mengurangi biaya elemen yang jarang ditampilkan atau kondisional. Saat Anda menggunakan x:Load pada kontainer seperti Grid atau StackPanel, kontainer dan semua turunannya dimuat atau dibongkar sebagai grup.

Pelacakan elemen yang ditangguhkan oleh kerangka kerja XAML menambahkan sekitar 600 byte ke penggunaan memori untuk setiap elemen yang dikaitkan dengan x:Load, untuk mempertangungjawabkan tempat penampung. Oleh karena itu, dimungkinkan untuk menggunakan atribut ini secara berlebihan sejauh performa Anda benar-benar menurun. Kami menyarankan agar Anda hanya menggunakannya pada elemen yang perlu disembunyikan. Jika Anda menggunakan x:Load pada kontainer, maka overhead hanya dibayar untuk elemen dengan atribut x:Load.

Penting

Atribut x:Load tersedia mulai dari Windows 10, versi 1703 (Pembaruan Kreator). Versi min yang ditargetkan oleh proyek Visual Studio Anda harus Windows 10 Creators Update (10.0, Build 15063) untuk menggunakan x:Load.

Penggunaan atribut XAML

<object x:Load="True" .../>
<object x:Load="False" .../>
<object x:Load="{x:Bind Path.to.a.boolean, Mode=OneWay}" .../>

Memuat Elemen

Ada beberapa cara berbeda untuk memuat elemen:

  • Gunakan ekspresi x:Bind untuk menentukan status beban. Ekspresi harus mengembalikan true untuk memuat dan salah untuk membongkar elemen.
  • 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 x:Load.
  • Targetkan elemen yang dibongkar di Storyboard apa pun.

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.
  • Bidang untuk x:Name diatur.
  • Setiap pengikatan x:Bind pada elemen dievaluasi.
  • Jika Anda telah mendaftar untuk menerima pemberitahuan perubahan properti pada properti yang berisi elemen yang ditangguhkan, pemberitahuan akan dinaikkan.

Membongkar elemen

Untuk membongkar elemen:

  • Gunakan ekspresi x:Bind untuk menentukan status beban. Ekspresi harus mengembalikan true untuk memuat dan salah untuk membongkar elemen.
  • Di Halaman atau UserControl, panggil UnloadObject dan berikan referensi objek
  • Panggil Windows.UI.Xaml.Markup.XamlMarkupHelper.UnloadObject dan berikan referensi objek

Ketika objek dibongkar, objek akan diganti di pohon dengan tempat penampung. Instans objek akan tetap berada dalam memori sampai semua referensi telah dirilis. API UnloadObject pada Halaman/UserControl dirancang untuk merilis referensi yang disimpan oleh codegen untuk x:Name dan x:Bind. Jika Anda menyimpan referensi tambahan dalam kode aplikasi, referensi tersebut juga perlu dirilis.

Ketika elemen dibongkar, semua status yang terkait dengan elemen akan dibuang, jadi jika menggunakan x:Load sebagai versi Visibilitas yang dioptimalkan, pastikan semua status diterapkan melalui pengikatan, atau diterapkan kembali oleh kode saat peristiwa Dimuat diaktifkan.

Batasan

Pembatasan untuk menggunakan x:Load adalah:

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

Keterangan

Anda dapat menggunakan x:Load pada elemen berlapis, namun harus diwujudkan dari elemen terluar.  Jika Anda mencoba mewujudkan elemen anak sebelum induk direalisasikan, pengecualian akan dimunculkan.

Biasanya, kami sarankan Anda menuguhkan 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.

Waspadalah terhadap elemen yang ditangguhkan dalam ListView, karena akan mengurangi waktu startup 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:Load maka, ketika elemen atau pohon elemen direalisasikan, pengikatan diterapkan hingga dan termasuk fase saat ini. Fase yang ditentukan untuk x:Phase memang memengaruhi atau mengontrol status pemuatan elemen. Ketika item daftar didaur ulang sebagai bagian dari panning, elemen yang diwujudkan akan bereaksi dengan cara yang sama seperti elemen aktif lainnya, dan pengikatan yang dikompilasi (pengikatan {x:Bind} ) diproses menggunakan aturan yang sama, termasuk phasing.

Pedoman umumnya adalah mengukur performa aplikasi sebelum dan sesudahnya untuk memastikan Anda mendapatkan performa yang Diinginkan.

Contoh

<StackPanel>
    <Grid x:Name="DeferredGrid" x:Load="False">
        <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="Orange" Margin="0,0,4,4"/>
        <Rectangle Height="100" Width="100" Fill="Green" Grid.Column="1" Margin="4,0,0,4"/>
        <Rectangle Height="100" Width="100" Fill="Blue" Grid.Row="1" Margin="0,4,4,0"/>
        <Rectangle Height="100" Width="100" Fill="Gold" Grid.Row="1" Grid.Column="1" Margin="4,4,0,0"
                   x:Name="one" x:Load="{x:Bind (x:Boolean)CheckBox1.IsChecked, Mode=OneWay}"/>
        <Rectangle Height="100" Width="100" Fill="Silver" Grid.Row="1" Grid.Column="1" Margin="4,4,0,0"
                   x:Name="two" x:Load="{x:Bind Not(CheckBox1.IsChecked), Mode=OneWay}"/>
    </Grid>

    <Button Content="Load elements" Click="LoadElements_Click"/>
    <Button Content="Unload elements" Click="UnloadElements_Click"/>
    <CheckBox x:Name="CheckBox1" Content="Swap Elements" />
</StackPanel>
// This is used by the bindings between the rectangles and check box.
private bool Not(bool? value) { return !(value==true); }

private void LoadElements_Click(object sender, RoutedEventArgs e)
{
    // This will load the deferred grid, but not the nested
    // rectangles that have x:Load attributes.
    this.FindName("DeferredGrid"); 
}

private void UnloadElements_Click(object sender, RoutedEventArgs e)
{
     // This will unload the grid and all its child elements.
     this.UnloadObject(DeferredGrid);
}