이벤트가 RoutedEventArgs
으로 나열되면 이벤트가 라우트됩니다. 라우트 된 이벤트는 Bubble, Tunnel 또는 Direct의 RoutingStrategy를 지원합니다.
private void Grid_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("Button Test clicked!");
}
가
RoutedEventArgs
이 지정, 그래서 라우트 된 이벤트 것 :의이
Button.Click
의 이벤트 핸들러에서 살펴 보자.
미리보기은 이름에 지정되지 않았으므로이 Bubble 이벤트입니다. 당신이
TestButton
클릭하면
<Grid ButtonBase.Click="Grid_Click">
<Button Name="TestButton" Width="100" Height="30" Content="Test" />
</Grid>
, 이벤트가 Grid
이상으로 상승하는 것입니다, 그리고 메시지가 표시됩니다 : 이것은 다음과 같은 방법으로 입증 할 수
버튼 테스트 클릭을! 표준 컨트롤의 많은 Tunneling
Usefulness of Bubbling/Tunneling strategies
는 이벤트를 수신 예를 들어 등 KeyDown
, MouseDown
등 - DataGrid
제어 할 수 있습니다. Enter 키를 눌러 레코드 추가라는 기능을 원합니다. 그러나 DataGrid
에는 이미 KeyDown
이벤트가있어 이벤트가 발생하지 않습니다. 따라서 터널 이벤트에서 로직을 수행해야합니다 (PreviewKeyDown
). KeyDown
이벤트 이전에 작동합니다. RichTextBoxControl
에도 동일하게 적용됩니다. Bubbling
때때로, 당신은 특정 이벤트에 대한 전역 핸들러가 필요합니다, 그래서 VisualTree의 모든 컨트롤했다. 자연스럽게, 당신은 그것을 할 수없는 직접적인 사건입니다. 따라서 무대에서는 버블 링 이벤트가 발생합니다. 또 다른 이유는 WPF의 이데올로기입니다. Image
, 다른 Button
등 :
![enter image description here](https://i.stack.imgur.com/j8EIj.gif)
사용자는 Button
에 TextBlock/Image
을 클릭하면이 Button
아무것도 포함 할 수 있습니다. 클릭이 Button
에 있음을 어떻게 알 수 있습니까? Bubbling 이벤트의 도움으로 맞습니다.
자세한 내용은 다음을 참조하십시오
,691 다음 Button
에 클릭의 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);
}
결과 : 나는 Click
핸들러를 조금 변경
Understanding Routed Events and Commands In WPF
Edit
![enter image description here](https://i.stack.imgur.com/7vd1v.png)
그러나 내가 아는 한, 클릭은 버블 링 이벤트가 아닌 직접 이벤트입니다. – SanSolo
@SanSolo : 직접 보낸 경우 'Button Test Clicked!'메시지가 나타나지 않습니다. 'Button'이 아닌'Grid'에 대한 핸들러를 설정하고'Button'을 클릭하면 그 이벤트는'Grid'에 대해 작동합니다. 'Button' 이벤트가 올라와'Grid'에 왔습니다. 내가 아는 한 직접 클릭 이벤트는 *'WinForms' *에있었습니다. –
@SanSolo : 내 편집을 참조하십시오. –