Wenn das Ereignis RoutedEventArgs
aufgeführt ist, dann ist es Routingereignis. Routingereignisse unterstützen eine RoutingStrategy von Bubble, Tunnel oder Direct.Schauen wir uns die Event-Handler von Button.Click
einen Blick:
private void Grid_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("Button Test clicked!");
}
Es RoutedEventArgs
angegeben, so ist es Ereignis geführt. Weil die Vorschau nicht im Namen angegeben wurde, daher dieses Bubble-Ereignis. Dies kann auf folgende Weise demonstriert werden:
<Grid ButtonBase.Click="Grid_Click">
<Button Name="TestButton" Width="100" Height="30" Content="Test" />
</Grid>
Wenn Sie auf den TestButton
klicken, wird das Ereignis über den Grid
steigen wird, und zeigt eine Meldung an:
Knopf-Test geklickt!
Usefulness of Bubbling/Tunneling strategies
Tunneling
Viele der Standardsteuerungen hören Ereignisse, wie KeyDown
, MouseDown
, etc. Zum Beispiel - DataGrid
Kontrolle. Ich möchte durch Drücken der Eingabetaste die Funktion aufrufen einen Datensatz hinzufügen. Aber DataGrid
hat bereits KeyDown
Ereignis, so dass das Ereignis nicht ausgelöst wird. Sie müssen also Ihre Logik im Ereignis Tunnel tun - PreviewKeyDown
, es wird vor dem Ereignis KeyDown
funktionieren. Gleiches gilt für RichTextBoxControl
.
Bubbling
Manchmal müssen Sie einen globalen Handler für ein bestimmtes Ereignis, so arbeitete sie für alle Bedienelemente in VisualTree. Natürlich, das direkte Ereignis kann man nicht machen. Daher auf der Bühne kommt Bubbling Event.
Ein weiterer Grund ist die Ideologie der WPF. Diese Button
kann alles enthalten: Image
, eine andere Button
, etc:

Der Benutzer auf der TextBlock/Image
im Button
klicken. Woher wissen wir, dass der Klick in Button
war? Das ist richtig, mit Hilfe von Bubbling-Event.
Weitere Informationen finden Sie unter:
Understanding Routed Events and Commands In WPF
Edit
ich wenig ein Click
Handler geändert:
private void Grid_Click(object sender, RoutedEventArgs e)
{
String message = "#" + eventCounter.ToString() + ":\r\n" +
" Sender: " + sender.ToString() + ":\r\n" +
" Source: " + e.Source + ":\r\n" +
" Original Source: " + e.OriginalSource;
lstEvents.Items.Add(message);
}
Ergebnis Klick auf den Button
:

Aber soweit ich weiß, ist Click ein direktes Ereignis und kein Sprudeln. – SanSolo
@SanSolo: Wenn es direkt war, dann wurde die Nachricht 'Button Test angeklickt!' Nicht angezeigt. Wir setzen einen Handler für das 'Grid', nicht für den' Button', und einen Klick auf den 'Button', das Event funktionierte für das' Grid'. Das Ereignis am "Button" ging nach oben und kam zum "Grid". Direct Click Event, soweit ich weiß, war in * 'WinForms' *. –
@SanSolo: Bitte sehen Sie meine Bearbeitung. –