본문 바로가기
Programming/WPF

WPF의 routedevent. Event처리시 e.handle=true를 해주는 이유

by 곰네Zip 2022. 10. 20.

먼저.. WPF에서 UI Element에 대해서 간단히 그리면 아래와 같다. 그냥 UserControl에 Grid와 Button하나를 다음과 같이 넣는다고 해보자.

<UserControl>
	<Grid>
    	<Button Content="Test1" />
        <Button Content="Test2" />
    </Grid>
</UserControl>

 화면에는 이렇게 그려질거다..

 z-index를 기준으로 그리면 아래와 같고..

Control들 위치.

 여기서 만약 사용자가 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와 관련하여 자세한 내용은 아래 링크 참조.

https://learn.microsoft.com/ko-kr/dotnet/desktop/wpf/events/routed-events-overview?view=netdesktop-6.0#the-concept-of-handled 

 

라우트된 이벤트 개요 - WPF .NET

요소 트리를 통해 라우팅되는 방법 및 사용자 지정 라우트된 이벤트를 만드는 방법을 포함하여 WPF(Windows Presentation Foundation)의 라우트된 이벤트에 대해 알아봅니다.

learn.microsoft.com

 

 

반응형

댓글