Nesne yaşam süresi olayları (WPF .NET)

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 , Loadedve Unloaded yaşam süresi olaylarını Initializeduygular. Geliştiriciler bu yaşam süresi olaylarını, öğeleri içeren arka planda kod oluşturma işlemleri için kanca 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.

Önemli

.NET 7 ve .NET 6 için Masaüstü Kılavuzu belgeleri yapım aşamasındadır.

Ön koş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 yaşam süresi olayları

WPF çerçeve düzeyi öğeleri veya FrameworkContentElementöğesinden FrameworkElement 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 öğeler içeren ve her birinin , Loadedve Unloaded yaşam süresi olay işleyicilerini eklemek Initializediçin XAML özniteliği söz dizimini kullanan bir üst Canvas öğ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, arka planda 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ç nesnesinde , Loadedve Unloaded yaşam olaylarının Initializedçağrı sırasını gösterir. Bu olaylar aşağıdaki bölümlerde, her ağaç nesnesine yükseltilen sırayla 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.

gibi Panel.Childrenbazı öğe özellikleri 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 arka planda dinamik olarak oluşturulduğunda, başlatmaları sıra dışı olabilir.

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 çevresindeki öğelerin, özellikle üst öğelerin oluşturulmamış olabileceğini unutmayın. Veya üye değişkenleri ve veri bağlamaları başlatılmamış olabilir.

Dekont

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.

OlayLoaded, mantıksal ağaç içindeki tüm öğeler yüklenene kadar öğe ağacındaki herhangi bir öğede tetiklenmemiştir. WPF olay sistemi önce bir öğe ağacının Loaded kök öğesinde olayı oluşturur, ardından ardışık her alt öğede en derin iç içe öğelere kadar aşağı doğru oluşturur. 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.

Dekont

WPF olay sistemi, zaman uyumsuz veri bağlamalarının olaydan önce Loaded tamamlandığını garantileyemez. Zaman uyumsuz veri bağlamaları dış veya dinamik kaynaklara bağlanır.

Kaldırılan yaşam süresi olayı

WPF olay sistemi bir öğede Unloaded olayı tetikler:

  • Sunu 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 Unloaded kök öğesinde olayı oluşturur, ardından ardışık her alt öğede en derin iç içe öğelere kadar aşağı doğru oluşturur. 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:

Ayrıca bkz.