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.
Önkoş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:
- CLR olay işleme modelinde de kullanılan AddressOf işlecine sahip AddHandler deyimi.
- Olay işleyicisi tanımında Handles anahtar sözcüğü. Daha fazla bilgi için bkz . Visual Basic ve WPF olay işleme.
- UIElement.AddHandler yöntemi, olay işleyicisine
AddressOf
başvurmak için işleciyle birlikte.
Ö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_Click
StackPanel1
öğ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 ButtonCreatedByXaml
ButtonCreatedByXaml_Click
:
- Önceden oluşturulmuş XAML öğe ağacına adlı
ButtonCreatedByCode
yeni bir düğme ekler. - Yeni düğmenin ad, içerik ve arka plan rengi gibi özelliklerini belirtir.
- Olay işleyicisini
ButtonCreatedByCode_Click
öğesineButtonCreatedByCode
atar. - aynı
ButtonCreatedByCode_Click
olay işleyicisini öğesineStackPanel1
atar.
Tıklandığında ButtonCreatedByCode
:
- Yönlendirilen Click olay üzerinde
ButtonCreatedByCode
oluşturulur. ButtonCreatedByCode_Click
AtananButtonCreatedByCode
olay işleyici tetikleniyor.- Yönlendirilen
Click
olay, öğe ağacından öğesineStackPanel1
doğru ilerler. ButtonCreatedByCode_Click
AtananStackPanel1
olay işleyici tetikleniyor.- Yönlendirilen
Click
olay, diğer çapraz geçiş öğelerine atanmış diğerClick
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:
- Olay işleyicisinin atandığı öğe olan gönderen nesnesi. ,
sender
işleyicinin ilk kez ve ikinci kez çalıştırılmasıStackPanel1
olacaktırButtonCreatedByCode
. - RoutedEventArgs.Source başlangıçta olayı tetikleyen öğe olan nesnesi. Bu örnekte,
Source
her zamanButtonCreatedByCode
şeklindedir.
Not
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.
.NET Desktop feedback