Kod kullanarak olay işleyicisi ekleme (WPF .NET)

İşaretlemeyi veya arka planda kodu kullanarak Windows Presentation Foundation'daki (WPF) bir öğeye olay işleyicisi atayabilirsiniz. Genişletilebilir Uygulama Biçimlendirme Dili'nde (XAML) bir olay işleyicisi atamak özel bir işlem olsa da, bazen arka planda bir olay işleyicisi atamanız gerekebilir. Örneğin, aşağıdaki durumlarda kodu kullanın:

  • Öğesini içeren işaretleme sayfası yüklendikten sonra bir öğeye olay işleyicisi atarsınız.
  • Öğeyi içeren işaretleme sayfasından sonra bir öğe ekler ve olay işleyicisini atarsınız.
  • Uygulamanızın öğe ağacını tamamen kodda tanımlarsınız.

Önemli

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

Ön koşullar

Makalede, yönlendirilen olaylar hakkında temel bilgiler edindiğiniz ve Yönlendirilen olaylara genel bakış makalesini okuduğunuz varsayılır. Bu makaledeki örnekleri takip etmek için, Genişletilebilir Uygulama biçimlendirme dili (XAML) hakkında bilgi sahibi olmanız ve Windows Presentation Foundation (WPF) uygulamalarının nasıl yazıldığından haberdar olmanız yardımcı olur.

Olay işleyici ataması için söz dizimi

C# kullanarak olay işleyicisi atamayı destekler:

  • ortak += dil çalışma zamanı (CLR) olay işleme modelinde de kullanılan işleç.
  • UIElement.AddHandler yöntemi.

VB, aşağıdakiler kullanılarak olay işleyicisi atamayı destekler:

Örnek

Aşağıdaki örnek, adlandırılmış ButtonCreatedByXaml bir Button tanımlamak ve yöntemini olay işleyicisi olarak Click atamak ButtonCreatedByXaml_Click için XAML kullanır. Click , 'den ButtonBasetüretilen düğmeler için yerleşik bir yönlendirilmiş olaydır.

<StackPanel Name="StackPanel1">
    <Button
        Name="ButtonCreatedByXaml" 
        Click="ButtonCreatedByXaml_Click"
        Content="Create a new button with an event handler"
        Background="LightGray">
    </Button>
</StackPanel>

Örnek, ve işleyicilerini uygulamak ve işleyiciyi ButtonCreatedByXaml_Click ve ButtonCreatedByCode_ClickStackPanel1 öğelerine atamak ButtonCreatedByCode_Click için ButtonCreatedByCode arka planda kod kullanır. Olay işleyicisi yöntemleri yalnızca arka planda kodla uygulanabilir.

// The click event handler for the existing button 'ButtonCreatedByXaml'.
private void ButtonCreatedByXaml_Click(object sender, RoutedEventArgs e)
{
    // Create a new button.
    Button ButtonCreatedByCode = new();

    // Specify button properties.
    ButtonCreatedByCode.Name = "ButtonCreatedByCode";
    ButtonCreatedByCode.Content = "New button and event handler created in code";
    ButtonCreatedByCode.Background = Brushes.Yellow;

    // Add the new button to the StackPanel.
    StackPanel1.Children.Add(ButtonCreatedByCode);

    // Assign an event handler to the new button using the '+=' operator.
    ButtonCreatedByCode.Click += new RoutedEventHandler(ButtonCreatedByCode_Click);

    // Assign an event handler to the new button using the AddHandler method.
    // AddHandler(ButtonBase.ClickEvent, new RoutedEventHandler(ButtonCreatedByCode_Click);

    // Assign an event handler to the StackPanel using the AddHandler method.
    StackPanel1.AddHandler(ButtonBase.ClickEvent, new RoutedEventHandler(ButtonCreatedByCode_Click));
}

// The Click event handler for the new button 'ButtonCreatedByCode'.
private void ButtonCreatedByCode_Click(object sender, RoutedEventArgs e)
{
    string sourceName = ((FrameworkElement)e.Source).Name;
    string senderName = ((FrameworkElement)sender).Name;

    Debug.WriteLine($"Routed event handler attached to {senderName}, " +
        $"triggered by the Click routed event raised by {sourceName}.");
}
' The click event handler for the existing button 'ButtonCreatedByXaml'.
Private Sub ButtonCreatedByXaml_Click(sender As Object, e As RoutedEventArgs)

    ' Create a new button and specify button properties.
    Dim ButtonCreatedByCode As New Button With {
        .Name = "ButtonCreatedByCode",
        .Content = "New button and event handler created in code",
        .Background = Brushes.Yellow
    }

    ' Add the new button to the StackPanel.
    StackPanel1.Children.Add(ButtonCreatedByCode)

    ' Assign an event handler to the new button using the AddHandler statement.
    AddHandler ButtonCreatedByCode.Click, AddressOf ButtonCreatedByCode_Click

    ' Assign an event handler to the new button using the AddHandler method.
    ' ButtonCreatedByCode.AddHandler(ButtonBase.ClickEvent, New RoutedEventHandler(AddressOf ButtonCreatedByCode_Click))

    ' Assign an event handler to the StackPanel using the AddHandler method.
    StackPanel1.AddHandler(ButtonBase.ClickEvent, New RoutedEventHandler(AddressOf ButtonCreatedByCode_Click))

End Sub

' The Click event handler for the new button 'ButtonCreatedByCode'.
Private Sub ButtonCreatedByCode_Click(sender As Object, e As RoutedEventArgs)

    Dim sourceName As String = CType(e.Source, FrameworkElement).Name
    Dim senderName As String = CType(sender, FrameworkElement).Name

    Debug.WriteLine($"Routed event handler attached to {senderName}, " +
        $"triggered by the Click routed event raised by {sourceName}.")

End Sub

Tıklandığında ve olay işleyicisi program aracılığıyla çalıştırıldığında ButtonCreatedByXamlButtonCreatedByXaml_Click :

  1. Önceden oluşturulmuş XAML öğe ağacına adlı ButtonCreatedByCode yeni bir düğme ekler.
  2. Yeni düğmenin ad, içerik ve arka plan rengi gibi özelliklerini belirtir.
  3. Olay işleyicisini ButtonCreatedByCode_Click öğesine ButtonCreatedByCodeatar.
  4. aynı ButtonCreatedByCode_Click olay işleyicisini öğesine StackPanel1atar.

Tıklandığında ButtonCreatedByCode :

  1. Yönlendirilen Click olay üzerinde ButtonCreatedByCodeoluşturulur.
  2. ButtonCreatedByCode_Click Atanan ButtonCreatedByCode olay işleyici tetikleniyor.
  3. Yönlendirilen Click olay, öğe ağacından öğesine StackPanel1doğru ilerler.
  4. ButtonCreatedByCode_Click Atanan StackPanel1 olay işleyici tetikleniyor.
  5. Yönlendirilen Click olay, diğer çapraz geçiş öğelerine atanmış diğer Click olay işleyicilerini tetikleme olasılığı olan öğe ağacını yukarı doğru devam eder.

Olay işleyicisi ButtonCreatedByCode_Click , olayı tetikleyen olay hakkında aşağıdaki bilgileri elde eder:

Dekont

Yönlendirilen bir olay ile CLR olayı arasındaki önemli fark, yönlendirilen bir olayın öğe ağacından işleyicileri arayarak geçmesidir, ancak CLR olayı öğe ağacını dolaşmaz ve işleyiciler yalnızca olayı oluşturan kaynak nesneye bağlanabilir. Sonuç olarak, yönlendirilmiş bir olay sender öğe ağacındaki herhangi bir çapraz geçiş öğesi olabilir.

Yönlendirilmiş olayları oluşturma ve işleme hakkında daha fazla bilgi için bkz . Özel yönlendirilmiş olay oluşturma ve Yönlendirilmiş olayı işleme.

Ayrıca bkz.