Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
XAML uygulamanızın başlangıç, görsel ağaç oluşturma ve bellek kullanımını iyileştirmek için x:Load kullanabilirsiniz. x:Load'un kullanılması Görünürlük ile benzer bir görsel etkiye sahiptir, ancak öğe yüklenmediğinde belleği serbest bırakılır ve görsel ağaçtaki yerini işaretlemek için dahili olarak küçük bir yer tutucu kullanılır.
x:Load ile özniteliklendirilen UI öğesi, kod aracılığıyla veya x:Bind ifadesi kullanılarak yüklenebilir ve kaldırılabilir. Bu, seyrek veya koşullu olarak gösterilen öğelerin maliyetlerini azaltmak için yararlıdır. Grid veya StackPanel gibi bir kapsayıcıda x:Load kullandığınızda, kapsayıcı ve tüm alt öğeleri grup olarak yüklenir veya kaldırılır.
XAML çerçevesi tarafından ertelenen öğelerin izlenmesi, yer tutucuyu hesaba katmak için x:Load ile ilişkilendirilen her öğenin bellek kullanımına yaklaşık 600 bayt ekler. Bu nedenle, performansınızın gerçekten azaldığını ölçüde bu özniteliği aşırı kullanmak mümkündür. Bunu yalnızca gizli olması gereken öğelerde kullanmanızı öneririz. Bir kapsayıcıda x:Load kullanıyorsanız, ek yük yalnızca x:Load özniteliğine sahip öğe için ödenir.
Önemli
x:Load özniteliği Windows 10, sürüm 1703 'den (Creators Update) itibaren kullanılabilir. Visual Studio projenizin hedeflediği en düşük sürüm, x:Load kullanmak için Windows 10 Creators Update (10.0, Derleme 15063) olmalıdır.
XAML öznitelik kullanımı
<object x:Load="True" .../>
<object x:Load="False" .../>
<object x:Load="{x:Bind Path.to.a.boolean, Mode=OneWay}" .../>
Öğeleri Yükleme
Öğeleri yüklemenin birkaç farklı yolu vardır:
- Yükleme durumunu belirtmek için x:Bind ifadesi kullanın. İfade, öğesini yüklemek için true ve öğesini kaldırmak için false döndürmelidir.
- Öğesinde tanımladığınız adla FindName öğesini çağırın.
- Öğesinde tanımladığınız adla GetTemplateChild öğesini çağırın.
- VisualState'te, x:Load öğesini hedefleyen bir Setter veya Görsel Taslak animasyonu kullanın.
- Herhangi bir Storyboard'daki yüklenmemiş öğeyi hedefle.
Uyarı
Bir öğenin örneklenmesi başladığında, kullanıcı arabirimi iş parçacığında oluşturulur; bu nedenle, aynı anda çok fazla öğe oluşturulursa kullanıcı arabiriminde takılmalar meydana gelebilir.
Daha önce listelenen yollardan herhangi birinde ertelenen bir öğe oluşturulduktan sonra birkaç şey gerçekleşir:
- öğesinde Loaded olayı oluşturulur.
- x:Name alanı ayarlanır.
- öğesindeki herhangi bir x:Bind bağlaması uygulanır.
- Ertelenen öğeleri içeren özellikte özellik değişikliği bildirimleri almak için kaydoldıysanız, bildirim oluşturulur.
Öğeleri boşaltma
Bir öğeyi kaldırmak için:
- Yükleme durumunu belirtmek için x:Bind ifadesi kullanın. İfade, öğesini yüklemek için true ve öğesini kaldırmak için false döndürmelidir.
- Page veya UserControl'de UnloadObject'i çağırın ve nesne başvurusunu geçirin.
- Microsoft.UI.Xaml.Markup.XamlMarkupHelper.UnloadObject öğesini çağırın ve nesne başvurusunu geçirin
Nesne kaldırıldığında, ağaçta bir yer tutucu öğe ile değiştirilir. Nesne örneği, tüm referanslar serbest bırakılana kadar bellekte kalır. Page/UserControl üzerindeki UnloadObject API'si, x:Name ve x:Bind için codegen'in tuttuğu referansları serbest bırakmak amacıyla tasarlanmıştır. Uygulama kodunda ek referanslar barındırıyorsanız, bunların da serbest bırakılması gerekir.
Bir öğe boşaltıldığında, öğe ile ilişkili tüm durumlar silinir, dolayısıyla görünürlüğün optimize edilmiş bir sürümü olarak x:Load kullanılıyorsa, tüm durumun bağlamalar ile aktarıldığından veya Yüklendi olayı tetiklendiğinde kod tarafından yeniden uygulandığından emin olun.
Restrictions
x:Load kullanma kısıtlamaları şunlardır:
- Öğeyi daha sonra bulmanın bir yolu olması gerektiğinden, öğe için bir x:Name tanımlamanız gerekir.
- Yalnızca UIElement veya FlyoutBase'den türetilen türlerde x:Load kullanabilirsiniz.
- Sayfa, UserControl veya DataTemplate içindeki kök öğelerde x:Load kullanamazsınız.
- ResourceDictionary'deki öğelerde x:Load kullanamazsınız.
- XamlReader.Load ile yüklenen gevşek XAML üzerinde x:Load kullanamazsınız.
- Ebeveyn öğenin taşınması, yüklenmemiş öğelerin silinmesine neden olur.
Açıklamalar
İç içe öğelerde x:Load kullanabilirsiniz, ancak bunların içindeki en dış öğeden gerçekleştirilmesi gerekir. Üst öğe gerçekleştirilmeden önce bir alt öğe gerçekleştirmeye çalışırsanız, bir özel durum oluşturulur.
Genellikle, ilk karede görüntülenemeyen öğeleri ertelemenizi öneririz. Ertelenecek adayları bulmak için iyi bir kılavuz, daraltılmış Görünürlük ile oluşturulan öğeleri aramaktır. Ayrıca, kullanıcı etkileşimi tarafından tetiklenen kullanıcı arabirimi, erteleyebileceğiniz öğeleri aramak için iyi bir yerdir.
Bir ListView'daki öğelerin ertelendiğinden, başlangıç sürenizi azaltacağı gibi, oluşturduğunuz öğelere bağlı olarak kaydırma performansınızı da düşürebilir. Kaydırma performansını artırmak istiyorsanız {x:Bind} işaretleme uzantısına ve x:Phase özniteliği belgelerine bakın.
x:Phase özniteliğix:Load ile birlikte kullanılıyorsa, bir öğe veya öğe ağacı gerçekleştirildiğinde, bağlamalar geçerli aşamaya kadar uygulanır ve bu aşama da kapsam dahiline alınır. x:Phase için belirtilen aşama, öğenin yükleme durumunu etkiler veya denetler. Bir liste öğesi kaydırma işleminin bir parçası olarak geri dönüştürüldüyse, gerçekleştirilen öğeler diğer etkin öğelerle aynı şekilde davranır ve derlenmiş bağlamalar ({x:Bind} bağlamaları) phasing de dahil olmak üzere aynı kurallar kullanılarak işlenir.
Genel bir kılavuz, istediğiniz performansı elde ettiğinizden emin olmak için uygulamanızın önce ve sonra performansını ölçmektir.
Bir öğeye x:Load eklerken davranıştaki değişiklikleri en aza indirmek için x:Bind bağlamaları, x:Load kullanılan öğe yokmuş gibi normal zamanlarda hesaplanır. Örneğin, kök öğe yüklendiğinde OneTime x:Bind bağlamaları hesaplanır. x :Bind bağlaması hesaplandığında öğe henüz gerçekleştirilmediyse, bu durumda hesaplanan değer kaydedilir ve öğe yüklendiğinde uygulanır. x:Bind bağlamalarının öğe gerçekleştiğinde hesaplanmasını bekliyorsanız, bu davranış şaşırtıcı olabilir.
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);
}
Windows developer