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.
Kullanım ömrü boyunca, Microsoft .NET yönetilen kodundaki tüm nesneler oluşturma, kullanma ve yok etme aşamalarından geçer. Windows Presentation Foundation (WPF), yaşam süresi olaylarını yükselterek bu aşamaların bir nesne üzerinde gerçekleştiğini belirten bir bildirim sağlar. WPF çerçeve düzeyi öğeleri (görsel nesneler) için WPF, Initialized, Loaded, ve Unloaded yaşam süresi olaylarını uygular. Geliştiriciler, bu yaşam süresi olaylarını, öğeleri içeren kod arkası işlemleri için bir tetikleyici olarak kullanabilir. Bu makalede görsel nesneler için yaşam süresi olayları açıklanır ve ardından pencere öğeleri, gezinti konakları veya uygulama nesneleri için özel olarak geçerli olan diğer yaşam süresi olayları tanıtılmaktadır.
Önkoşullar
Bu makalede WPF öğe düzeninin ağaç olarak kavramsallaştırılabildiğine ve Yönlendirilen olaylara genel bakış makalesini okuduğunuza dair temel bilgiler varsayılır. Bu makaledeki örnekleri takip etmek için Genişletilebilir Uygulama biçimlendirme dili (XAML) hakkında bilgi sahibi olmanız ve WPF uygulamalarının nasıl yazabileceğinizi bilmeniz yardımcı olur.
Görsel nesneler için ömür döngüsü olayları
WPF çerçeve düzeyi öğeleri FrameworkElement veya FrameworkContentElement öğesinden türetilir.
Initialized, Loadedve Unloaded yaşam süresi olayları tüm WPF çerçeve düzeyi öğeleri için ortaktır. Aşağıdaki örnekte öncelikle XAML'de uygulanan bir öğe ağacı gösterilmektedir. XAML, iç içe geçmiş öğeler içeren ve her biri Canvas, Initialized ve Loaded yaşam süresi olay işleyicilerini eklemek için XAML öznitelik söz dizimini kullanan bir üst Unloaded öğe tanımlar.
<Canvas x:Name="canvas">
<StackPanel x:Name="outerStackPanel" Initialized="InitHandler" Loaded="LoadHandler" Unloaded="UnloadHandler">
<custom:ComponentWrapper x:Name="componentWrapper" Initialized="InitHandler" Loaded="LoadHandler" Unloaded="UnloadHandler">
<TextBox Name="textBox1" Initialized="InitHandler" Loaded="LoadHandler" Unloaded="UnloadHandler" />
<TextBox Name="textBox2" Initialized="InitHandler" Loaded="LoadHandler" Unloaded="UnloadHandler" />
</custom:ComponentWrapper>
</StackPanel>
<Button Content="Remove canvas child elements" Click="Button_Click"/>
</Canvas>
XAML öğelerinden biri, kod arkasında yaşam süresi olay işleyicileri atayan bir temel sınıftan türetilen özel bir denetimdir.
public partial class MainWindow : Window
{
public MainWindow() => InitializeComponent();
// Handler for the Initialized lifetime event (attached in XAML).
private void InitHandler(object sender, System.EventArgs e) =>
Debug.WriteLine($"Initialized event on {((FrameworkElement)sender).Name}.");
// Handler for the Loaded lifetime event (attached in XAML).
private void LoadHandler(object sender, RoutedEventArgs e) =>
Debug.WriteLine($"Loaded event on {((FrameworkElement)sender).Name}.");
// Handler for the Unloaded lifetime event (attached in XAML).
private void UnloadHandler(object sender, RoutedEventArgs e) =>
Debug.WriteLine($"Unloaded event on {((FrameworkElement)sender).Name}.");
// Remove nested controls.
private void Button_Click(object sender, RoutedEventArgs e) =>
canvas.Children.Clear();
}
// Custom control.
public class ComponentWrapper : ComponentWrapperBase { }
// Custom base control.
public class ComponentWrapperBase : StackPanel
{
public ComponentWrapperBase()
{
// Assign handler for the Initialized lifetime event (attached in code-behind).
Initialized += (object sender, System.EventArgs e) =>
Debug.WriteLine($"Initialized event on componentWrapperBase.");
// Assign handler for the Loaded lifetime event (attached in code-behind).
Loaded += (object sender, RoutedEventArgs e) =>
Debug.WriteLine($"Loaded event on componentWrapperBase.");
// Assign handler for the Unloaded lifetime event (attached in code-behind).
Unloaded += (object sender, RoutedEventArgs e) =>
Debug.WriteLine($"Unloaded event on componentWrapperBase.");
}
}
/* Output:
Initialized event on textBox1.
Initialized event on textBox2.
Initialized event on componentWrapperBase.
Initialized event on componentWrapper.
Initialized event on outerStackPanel.
Loaded event on outerStackPanel.
Loaded event on componentWrapperBase.
Loaded event on componentWrapper.
Loaded event on textBox1.
Loaded event on textBox2.
Unloaded event on outerStackPanel.
Unloaded event on componentWrapperBase.
Unloaded event on componentWrapper.
Unloaded event on textBox1.
Unloaded event on textBox2.
*/
Partial Public Class MainWindow
Inherits Window
Public Sub New()
InitializeComponent()
End Sub
' Handler for the Initialized lifetime event (attached in XAML).
Private Sub InitHandler(sender As Object, e As EventArgs)
Debug.WriteLine($"Initialized event on {CType(sender, FrameworkElement).Name}.")
End Sub
' Handler for the Loaded lifetime event (attached in XAML).
Private Sub LoadHandler(sender As Object, e As RoutedEventArgs)
Debug.WriteLine($"Loaded event on {CType(sender, FrameworkElement).Name}.")
End Sub
' Handler for the Unloaded lifetime event (attached in XAML).
Private Sub UnloadHandler(sender As Object, e As RoutedEventArgs)
Debug.WriteLine($"Unloaded event on {CType(sender, FrameworkElement).Name}.")
End Sub
Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
' Remove nested controls.
canvas.Children.Clear()
End Sub
End Class
' Custom control.
Public Class ComponentWrapper
Inherits ComponentWrapperBase
End Class
' Custom base control.
Public Class ComponentWrapperBase
Inherits StackPanel
Public Sub New()
' Attach handlers for the lifetime events.
AddHandler Initialized, AddressOf InitHandler
AddHandler Loaded, AddressOf LoadHandler
AddHandler Unloaded, AddressOf UnloadHandler
End Sub
' Handler for the Initialized lifetime event (attached in code-behind).
Private Sub InitHandler(sender As Object, e As EventArgs)
Debug.WriteLine("Initialized event on componentWrapperBase.")
End Sub
' Handler for the Loaded lifetime event (attached in code-behind).
Private Sub LoadHandler(sender As Object, e As RoutedEventArgs)
Debug.WriteLine("Loaded event on componentWrapperBase.")
End Sub
' Handler for the Unloaded lifetime event (attached in code-behind).
Private Sub UnloadHandler(sender As Object, e As RoutedEventArgs)
Debug.WriteLine("Unloaded event on componentWrapperBase.")
End Sub
End Class
'Output:
'Initialized event on textBox1.
'Initialized event on textBox2.
'Initialized event on componentWrapperBase.
'Initialized event on componentWrapper.
'Initialized event on outerStackPanel.
'Loaded event on outerStackPanel.
'Loaded event on componentWrapperBase.
'Loaded event on componentWrapper.
'Loaded event on textBox1.
'Loaded event on textBox2.
'Unloaded event on outerStackPanel.
'Unloaded event on componentWrapperBase.
'Unloaded event on componentWrapper.
'Unloaded event on textBox1.
'Unloaded event on textBox2.
Program çıktısı, her ağaç nesnesindeki Initialized, Loaded ve Unloaded yaşam olaylarının çağrı sırasını gösterir. Bu olaylar aşağıdaki bölümlerde, her ağaç nesnesinde oluş sırasına göre açıklanmıştır.
Başlatılan yaşam süresi olayı
WPF olay sistemi bir öğede Initialized olayı tetikler:
- öğesinin özellikleri ayarlandığında.
- Nesnenin oluşturucusunun çağrısıyla başlatılmasıyla aynı zamanda.
Bazı öğe özellikleri, Panel.Children gibi, alt öğeler içerebilir. Üst öğeler, alt öğeleri başlatılana kadar başlatmayı raporlayamaz. Bu nedenle, özellik değerleri bir öğe ağacındaki en derin iç içe öğelerle başlayarak ve ardından uygulama köküne kadar ardışık üst öğelerle ayarlanır.
Initialized Bir öğenin özellikleri ayarlandığında olay oluştuğundan, bu olay önce işaretlemede tanımlandığı gibi en derin iç içe geçmiş öğelerde çağrılır ve ardından uygulama köküne kadar ardışık üst öğeler gelir. Nesneler code-behind'da dinamik olarak oluşturulduğunda, başlatmaları doğru sırayla gerçekleşmeyebilir.
WPF olay sistemi, bir öğede olayı oluşturmadan önce öğe ağacındaki tüm öğelerin başlatılmasını Initialized beklemez. Bu nedenle, herhangi bir öğe için bir Initialized olay işleyicisi yazdığınızda, mantıksal veya görsel ağaçtaki etrafındaki öğelerin, özellikle ebeveyn öğelerin oluşturulmamış olabileceğini unutmayın. Veya üye değişkenleri ve veri bağlamaları başlatılmamış olabilir.
Uyarı
Initialized Olay bir öğede tetiklendiğinde, öğenin dinamik kaynaklar veya bağlama gibi ifade kullanımları değerlendirilmez.
Yüklenen yaşam süresi olayı
WPF olay sistemi bir öğede Loaded olayı tetikler:
- öğesini içeren mantıksal ağaç tamamlandığında ve bir sunu kaynağına bağlandığında. Sunu kaynağı pencere tutamacını (HWND) ve işleme yüzeyini sağlar.
- Diğer özellikler veya doğrudan tanımlanmış veri kaynakları gibi yerel kaynaklara veri bağlama işlemi tamamlandığında.
- Düzen sistemi, işleme için gerekli tüm değerleri hesapladıktan sonra.
- Son işlemeden önce.
Olay, mantıksal ağacın içindeki Loaded öğeler yüklenene kadar bir öğe ağacındaki herhangi bir öğede tetiklenmez. WPF olay sistemi, önce bir öğe ağacının kök öğesinde Loaded olayını tetikler, ardından en derin iç içe öğelere kadar ardışık her alt öğede tetiklemeye devam eder. Bu olay tünel yönlendirmeli bir olaya benzese de, Loaded olay bir öğeden diğerine olay verilerini taşımaz, bu nedenle olayı işlenmiş olarak işaretlemenin hiçbir etkisi olmaz.
Uyarı
WPF olay sistemi, zaman uyumsuz veri bağlamalarının Loaded olayından önce tamamlandığını garanti edemez. Zaman uyumsuz veri bağlamaları dış veya dinamik kaynaklara bağlanır.
Yüklenmeyen yaşam döngüsü olayı
WPF olay sistemi bir öğede Unloaded olayı tetikler:
- Sunum kaynağı kaldırıldıktan sonra veya
- Görsel üst öğesi kaldırıldıktan sonra.
WPF olay sistemi, önce bir öğe ağacının kök öğesinde Unloaded olayını tetikler, ardından en derin iç içe öğelere kadar ardışık her alt öğede tetiklemeye devam eder. Bu olay tünel yönlendirmeli bir olaya benzese de olay, Unloaded öğeden öğeye olay verilerini yaymadığından, olayı işlenmiş olarak işaretlemenin hiçbir etkisi olmaz.
Unloaded Olay bir öğede tetiklendiğinde, üst öğe veya mantıksal veya görsel ağaçta daha yüksek olan herhangi bir öğe önceden ayarlanmamış olabilir. Unset, bir öğenin veri bağlamalarının, kaynak başvurularının ve stillerinin artık normal veya bilinen son çalışma zamanı değerine ayarlanmamış olduğu anlamına gelir.
Diğer yaşam süresi olayları
Yaşam olayları perspektifinden bakıldığında, wpf nesnelerinin dört ana türü vardır: genel olarak öğeler, pencere öğeleri, gezinti konakları ve uygulama nesneleri. Initialized, Loadedve Unloaded yaşam süresi olayları tüm çerçeve düzeyindeki öğeler için geçerlidir. Diğer yaşam süresi olayları özellikle pencere öğeleri, gezinti konakları veya uygulama nesneleri için geçerlidir. Diğer yaşam süresi olayları hakkında daha fazla bilgi için bkz:
- Uygulama yönetimine genel bakış
- WPF pencerelerine genel bakışWindow öğeler için.
- Gezintiye genel bakış
Ayrıca bakınız
.NET Desktop feedback