먼저.. WPF에서 UI Element에 대해서 간단히 그리면 아래와 같다. 그냥 UserControl에 Grid와 Button하나를 다음과 같이 넣는다고 해보자.
<UserControl>
<Grid>
<Button Content="Test1" />
<Button Content="Test2" />
</Grid>
</UserControl>
화면에는 이렇게 그려질거다..
z-index를 기준으로 그리면 아래와 같고..
여기서 만약 사용자가 Test1 버튼을 누르면.. 이벤트는 다음과 같은 경로로 발생된다.
Base Element -> Control 까지 내려갔다가, 다시 Control -> Base Element로 넘어온다.
이 과정에서 내가 event를 별도로 처리하기 위해 EventHandler를 구현했을때..
이후에 더이상 routed event를 진행하지 않겠다고 한다면, e.handle = true로 설정해준다.
private void Test1Button_Click(object sender, RoutedEventArgs e){
//todo - implements event handler.
e.handle = true;
}
위와같이 처리하면 (e.handle = true), Test1Button을 클릭한것에 대한 event는 저 메소드에서 처리하고, 다음 routed에 있는 event는 저 click이벤트를 처리하지않는다.
event handling을 의도적으로 여러 컨트롤에서 다 수행되도록 할 것이 아니라면 가급적, e.handle = true;로 처리해주는게 좋다.
만약, e.handle = true가 없고, Grid에서도 click이벤트에 대한 eventhandler가 있다고하면, Test1 Button을 클릭했는데 event handler는 Button의 event handler도 수행되지만, grid의 event handler도 같이 수행된다.
이러한 동작은 예상치 못한 결과를 가져올 수 있으므로.. 가급적이면 e.handle = true로 설정하여, 필요한 곳에서 이벤트 처리를 하게 하는 것이 맞다.
만약 Button의 상위 element에서도 무언가 처리가 필요하면 button의 event handler에서 처리하도록 하는 것이 더 나은 선택.
Routed Event와 관련하여 자세한 내용은 아래 링크 참조.
댓글