x:Load 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 serupa dengan Visibility, kecuali bahwa ketika elemen tersebut tidak diaktifkan, memorinya dibebaskan, dan secara internal sebuah penanda kecil digunakan untuk menandai posisinya di dalam pohon visual.

Elemen UI yang diatribusikan 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 anak-anaknya dimuat atau dibongkar sebagai grup.

Pelacakan elemen yang ditunda oleh kerangka kerja XAML menambahkan sekitar 600 byte ke penggunaan memori untuk setiap elemen yang dikaitkan dengan atribut x:Load, untuk memperhitungkan tempat penampung. Oleh karena itu, dimungkinkan untuk menggunakan atribut ini secara berlebihan sejauh performa Anda benar-benar menurun. Sebaiknya 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.

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 menghasilkan nilai true untuk memuat dan false untuk menghentikan pemuatan elemen. Jika Anda menggunakan x:Bind di x:Load, jangan atur x:Name ke pengidentifikasi yang sama dengan jalur pengikatan; jika tidak, pengkompilasi XAML melaporkan kesalahan.
  • 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 tidak dimuat di Storyboard apa pun.

Nota

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

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

  • Peristiwa Yang dimuat pada elemen dinaikkan.
  • Bidang x:Name telah ditetapkan.
  • Pengikatan x:Bind apa pun pada elemen diterapkan.
  • Jika Anda telah mendaftar untuk menerima pemberitahuan perubahan properti pada properti yang berisi elemen yang ditangguhkan, pemberitahuan akan dinaikkan.

Membongkar elemen

Untuk melepaskan elemen:

  • Gunakan ekspresi x:Bind untuk menentukan status beban. Ekspresi harus menghasilkan nilai true untuk memuat dan false untuk menghentikan pemuatan elemen.
  • Di Halaman atau UserControl, panggil UnloadObject dan teruskan referensi objek
  • Panggil Microsoft.UI.Xaml.Markup.XamlMarkupHelper.UnloadObject dan teruskan referensi objek

Ketika objek dilepas, objek tersebut akan diganti di pohon dengan penanda sementara. Instans objek akan tetap dalam memori sampai semua referensi telah dirilis. UNloadObject API 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 muat, semua status yang terkait dengan elemen akan dihapus, jadi jika menggunakan x:Load sebagai versi Visibilitas yang dioptimalkan, pastikan semua status diterapkan melalui pengikatan, atau diterapkan kembali oleh kode ketika peristiwa Loaded dipicu.

Pembatasan

Batasan 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 Jendela, 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.

Nota

WinUI 3 (SDK Aplikasi Windows):Jendela tidak berasal dari FrameworkElement, sehingga tidak memiliki FindName metode. Di WinUI 3, FindName tidak berfungsi untuk merealisasikan elemen x:Load ketika akar XAML adalah Window, bahkan saat Anda memanggil FindName pada FrameworkElement yang merupakan turunan dari Window. x:Bind Gunakan ekspresi untuk mengontrol status beban sebagai gantinya. Untuk detailnya, lihat microsoft-ui-xaml #9842.

Nota

C++/WinRT (WinUI 2 / UWP): Menggunakan x:Load dengan x:Bind pada elemen yang sama dapat menghasilkan kesalahan kompilasi. Untuk detail dan solusinya, lihat microsoft-ui-xaml #7579.

Nota

C++/WinRT:FindName tidak memuat ulang elemen yang sebelumnya dibongkar dengan UnloadObject. x:Bind Gunakan ekspresi untuk mengontrol status beban sebagai gantinya.

Komentar

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

Biasanya, kami sarankan Anda menunda elemen yang tidak dapat dilihat di frame 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 sudah direalisasikan akan bereaksi dengan cara yang sama seperti elemen aktif lainnya, dan binding yang dikompilasi ({x:Bind} binding) diproses menggunakan aturan yang sama, termasuk pengaturan bertahap.

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

Untuk meminimalkan perubahan perilaku (selain performa) saat menambahkan x:Load ke elemen, pengikatan x:Bind dihitung pada waktu normalnya, seolah-olah tidak ada elemen yang digunakan x:Load. Misalnya, pengikatan OneTime x:Bind dihitung saat elemen root dimuat. Jika elemen tidak direalisasikan pada saat pengikatan x:Bind dihitung, maka nilai terhitung disimpan dan diterapkan ke elemen saat dimuat. Perilaku ini mungkin mengejutkan jika Anda mengharapkan pengikatan x:Bind untuk dihitung ketika elemen direalisasikan.

Example

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