[WPF] 공공데이터 포털 API 이용 클라이언트 구현 Part 3

이미지
그룹핑 ListViewItem 그룹핑 할 수 있습니다. 먼저 CheckBox에 Checked 이벤트를 통해 그룹핑을 추가하고 RemoveChecked 이벤트를 통해 그룹핑을 제거 할 수 있도록 CheckBox를 선언 합니다. 1: <!-- Group CheckBox --> 2: <CheckBox Grid.Column="0" 3: Grid.Row="0" 4: Checked="AddGrouping" 5: Unchecked="RemoveGrouping">Group by Name</CheckBox> 그룹 스타일 선언 GroupStyle 속성에 ContainerStyle 속성을 이용해 Style을 지정 합니다. Expander 컨트롤을 이용해 아파트명과 그룹 아이템의 개수를 Expander Header에 표시 하도록 ControlTemlate를 선언 합니다. 1: <!-- Group Style --> 2: <ListView.GroupStyle> 3: <GroupStyle> 4: <GroupStyle.ContainerStyle> 5: <Style TargetType="{x:Type GroupItem}"> 6: <Setter Property="Margin" Value="0,0,0,5" /> 7: <Setter Property="Te...

WPF Input Events

Input Events


Routed Events

Routed Events는 요소 트리와 잘 작동하도록 설계된 이벤트 타입 입니다. Routed Events가  발생하면 시각적 및 논리적 트리를 위,아래로 이동할 수 있어 사용자 정의 코드 없이 간단하고 일관된 방식으로 각 요소에서 이벤트를 발생 시킵니다. 

Routed Events 전략 및 이벤트 처리기

등록 된 모든 라우트 된 이벤트는 세 가지 라우팅 전략 중 하나를 선택합니다.
즉, 이벤트 발생이 요소 트리를 통해 이동하는 방식 중 하나를 선택합니다. 이러한 전략은 RoutingStrategy 열거 형의 값으로 표시됩니다.

  • Tunnerling - 루트에서 이벤트가 먼저 발생하고 소스 요소에 도달 할 때까지 (또는 핸들러가 이벤트를 처리 된 것으로 표시하여 터널링을 중지 할 때까지) 트리 아래의 각 요소에서 발생합니다.

  • Bubbling - 이벤트는 소스 요소에서 먼저 발생하고 루트에 도달 할 때까지 (또는 처리기가 이벤트를 처리 된 것으로 표시하여 버블 링을 중단 할 때까지) 트리 위쪽의 각 요소에서 발생합니다.

  • Direct - 이벤트는 원본 요소에서만 발생합니다. 이는 일반 .NET 이벤트와 동일한 동작입니다.

라우트 된 이벤트 처리기는 일반적인 .NET 이벤트 처리기의 패턴과 일치하는 서명을가집니다. 첫 번째 매개 변수는 일반적으로 sender라는 System.Object이고 두 번째 매개 변수 (일반적으로 e라는)는 System.EventArgs에서 파생되는 클래스입니다.

sender 매개 변수는 항상 핸들러가 첨부 된 요소이며, e 매개 변수는 다음 네 가지 유용한 속성을 제공하는 EventArgs의 하위 클래스 인 RoutedEventArgs의 인스턴스입니다. RoutedEventArgs의 유용한 속성 :
  • Source - 원래 이벤트를 발생시킨 논리적 트리의 요소
  • OriginalSource - 이벤트를 발생시킨 시각적 트리의 요소 (예 : 표준 버튼의 TextBlock 또는 ButtonChrome 하위)입니다.
  • Handled - 이벤트를 처리 된 것으로 표시하려면 true로 설정할 수있는 부울입니다. 이것은 정확하게 터널링이나 버블 링을 중단시키는 것입니다.
  • RoutedEvent - 여러 라우트 된 이벤트에 대해 동일한 핸들러가 사용될 때 발생 이벤트를 식별하는 데 도움이되는 실제 라우트 된 이벤트 오브젝트 (예 : Button.ClickEvent).

터널링 이벤트는 Preview 접두어가 붙습니다. 터널링 이벤트는 버블링 이벤트 이전에 발생 합니다. 예를 들어, PreviewMouseMove는 MouseMove 버블링 이벤트 전에 발생하는 터널링 이벤트 입니다.

예제

Grid > StackPanel > UniformGrid > Button > Image 순으로 요소 트리를 구성 한 후 요소에 MouseRightButtonDown, PreviewMouseRightButtonDown 이벤트를 등록 합니다.
1:  <Grid MouseRightButtonDown="Grid_MouseRightButtonDown" PreviewMouseRightButtonDown="Grid_PreviewMouseRightButtonDown">  
2:      <StackPanel Orientation="Horizontal">  
3:        <UniformGrid Margin="10" MouseRightButtonDown="UniformGrid_MouseRightButtonDown" PreviewMouseRightButtonDown="UniformGrid_PreviewMouseRightButtonDown">  
4:          <Button Margin="10" BorderBrush="Black" BorderThickness="0" Background="White" MouseRightButtonDown="Button_MouseRightButtonDown" PreviewMouseRightButtonDown="Button_PreviewMouseRightButtonDown">  
5:            <Button.Content>  
6:              <Image Source="./Images/img1.jpg" Stretch="Fill" MouseRightButtonDown="Image_MouseRightButtonDown" PreviewMouseRightButtonDown="Image_PreviewMouseRightButtonDown" />  
7:            </Button.Content>  
8:          </Button>  
9:          <Button Margin="10" BorderBrush="Black" BorderThickness="0" Background="White" MouseRightButtonDown="Button_MouseRightButtonDown" PreviewMouseRightButtonDown="Button_PreviewMouseRightButtonDown">  
10:            <Button.Content>  
11:              <Image Source="./Images/img1.jpg" Stretch="Fill" MouseRightButtonDown="Image_MouseRightButtonDown" PreviewMouseRightButtonDown="Image_PreviewMouseRightButtonDown" />  
12:            </Button.Content>  
13:          </Button>  
14:          <Button Margin="10" BorderBrush="Black" BorderThickness="0" Background="White" MouseRightButtonDown="Button_MouseRightButtonDown" PreviewMouseRightButtonDown="Button_PreviewMouseRightButtonDown">  
15:            <Button.Content>  
16:              <Image Source="./Images/img1.jpg" Stretch="Fill" MouseRightButtonDown="Image_MouseRightButtonDown" PreviewMouseRightButtonDown="Image_PreviewMouseRightButtonDown" />  
17:            </Button.Content>  
18:          </Button>  
19:          <Button Margin="10" BorderBrush="Black" BorderThickness="0" Background="White" MouseRightButtonDown="Button_MouseRightButtonDown" PreviewMouseRightButtonDown="Button_PreviewMouseRightButtonDown">  
20:            <Button.Content>  
21:              <Image Source="./Images/img1.jpg" Stretch="Fill" MouseRightButtonDown="Image_MouseRightButtonDown" PreviewMouseRightButtonDown="Image_PreviewMouseRightButtonDown" />  
22:            </Button.Content>  
23:          </Button>  
24:        </UniformGrid>  
25:        <StackPanel Orientation="Vertical">  
26:          <Button Name="btnClear"  
27:            Padding="10,5"  
28:            >Clear</Button>  
29:          <TextBlock Name="textBlock1"  
30:              Margin="7,4,0,0"></TextBlock>  
31:        </StackPanel>  
32:      </StackPanel>  
33:    </Grid>  

비하인드 코드에 등록된 이벤트를 이용해 TextBlock에 텍스트를 출력하도록 합니다.
1:   private void Button_MouseRightButtonDown(object sender, MouseButtonEventArgs e)  
2:      {  
3:        textBlock1.Text += "Button Event\r\n";  
4:      }  
5:      private void UniformGrid_MouseRightButtonDown(object sender, MouseButtonEventArgs e)  
6:      {  
7:        textBlock1.Text += "UniformGrid Event\r\n";  
8:      }  
9:      private void Image_MouseRightButtonDown(object sender, MouseButtonEventArgs e)  
10:      {  
11:        textBlock1.Text += "Image Event\r\n";  
12:      }  
13:      private void UniformGrid_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)  
14:      {  
15:        textBlock1.Text += "UniformGrid Tunneling Event\r\n";  
16:      }  
17:      private void Button_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)  
18:      {  
19:        textBlock1.Text += "Button Tunneling Event\r\n";  
20:      }  
21:      private void Image_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)  
22:      {  
23:        textBlock1.Text += "Image Tunneling Event\r\n";  
24:      }  
25:      private void Grid_MouseRightButtonDown(object sender, MouseButtonEventArgs e)  
26:      {  
27:        textBlock1.Text += "Grid Event\r\n";  
28:      }  
29:      private void Grid_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)  
30:      {  
31:        textBlock1.Text += "Grid Tunneling Event\r\n";  
32:      }  

이제 버튼을 클릭 했을 때 Bubbling, Tunneling 이벤트가 어떻게 발생하는지 확인 해보겠습니다.


최상단의 Grid 요소부터 발생하기 시작해서 최하위 요소인 Image 요소까지 Tunneling Event가 먼저 발생하는 것을 볼 수 있습니다. 그 뒤 반대로 최하위 요소인 Image 부터 최상단 요소인 Grid 요소까지 Bubbling Event가 발생하는 것을 확인 할 수 있습니다.

댓글

이 블로그의 인기 게시물

[C#] Task 완료 시 다른 Task를 자동으로 수행

[C#] 태스크(Task)가 완료될 때 까지 대기하여 결과를 얻는 방법

[C#] 명시적으로 Task 생성 및 실행