[WPF] Grid를 마우스 클릭/터치했을 때의 이벤트 흐름(부모와 자식 관계 있음)

전체 추첨
h tps:// 퀵했다. 작은 m / 절 1707 / MS / 4f입니다 73D86 그림 d283 그림 C4f

이벤트 관련 복권
h tps:// 퀵했다. 작은 m/사 1707/있어 MS/4f다 73D86 그림에서 d283 그림 C4f#%그림 3%82%아 %96%아2%그림9%80%아3wpfaml

하고 싶은 일



이전 기사 에서 Grid 안에 Button 를 배치하여 이벤트의 흐름이 어떻게 될지 보았다.
그 때는 Button의 특성(ButtonBase의 특성)? 에 의해 Mouse계의 버블 이벤트는 오지 않는다는 것을 알았다.

그럼, Button이 아닌 컨트롤을 거듭한(부모와 자식으로 한) 경우는, 어떤 이벤트의 흐름이 되는 것인가? 봐.

했던 일



모든 컨트롤의 부모와 자식의 조합은 할 수 없기 때문에, 이번은 Grid 안에 Grid 를 넣어, 실험했다.

실험 프로그램



기본은, 이전 기사 로 작성한 것을 개조해 사용한다.
아래와 같이 xaml만 개조하였다.
(원래 Button이었던 곳을 Grid로 고쳤지만, 전부의 이벤트 핸들러의 이름을 바꾸는 것이 귀찮기 때문에, 그대로 두고)

코드



MainWindow.xaml
<Window x:Class="WpfApp64.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp64"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="1*"/>
            <RowDefinition Height="0*"/>
        </Grid.RowDefinitions>

        <Grid x:Name="MainGrid"
              Background="#66FF0000"
              Grid.Row="0"
              Margin="50"
              IsManipulationEnabled="False" 
              ManipulationStarting="MainGrid_ManipulationStarting" 
              ManipulationDelta="MainGrid_ManipulationDelta"
              ManipulationCompleted="MainGrid_ManipulationCompleted"

              PreviewMouseDown=             "MainGrid_PreviewMouseDown"             MouseDown="MainGrid_MouseDown"
              PreviewMouseUp=               "MainGrid_PreviewMouseUp"               MouseUp="MainGrid_MouseUp"
              PreviewTouchDown=             "MainGrid_PreviewTouchDown"             TouchDown="MainGrid_TouchDown"
              PreviewTouchUp=               "MainGrid_PreviewTouchUp"               TouchUp="MainGrid_TouchUp"
              PreviewStylusDown=            "MainGrid_PreviewStylusDown"            StylusDown="MainGrid_StylusDown"
              PreviewStylusUp=              "MainGrid_PreviewStylusUp"              StylusUp="MainGrid_StylusUp"
              PreviewMouseLeftButtonDown=   "MainGrid_PreviewMouseLeftButtonDown"   MouseLeftButtonDown="MainGrid_MouseLeftButtonDown"
              PreviewMouseLeftButtonUp=     "MainGrid_PreviewMouseLeftButtonUp"     MouseLeftButtonUp="MainGrid_MouseLeftButtonUp"
              PreviewMouseRightButtonDown=  "MainGrid_PreviewMouseRightButtonDown"  MouseRightButtonDown="MainGrid_MouseRightButtonDown"
              PreviewMouseRightButtonUp=    "MainGrid_PreviewMouseRightButtonUp"    MouseRightButtonUp="MainGrid_MouseRightButtonUp">

            <Grid Margin="50" Background="Yellow"
                PreviewMouseDown="Button_PreviewMouseDown"                          MouseDown="Button_MouseDown"
                PreviewMouseUp="Button_PreviewMouseUp"                              MouseUp="Button_MouseUp"
                PreviewTouchDown="Button_PreviewTouchDown"                          TouchDown="Button_TouchDown"
                PreviewTouchUp="Button_PreviewTouchUp"                              TouchUp="Button_TouchUp"
                PreviewStylusDown="Button_PreviewStylusDown"                        StylusDown="Button_StylusDown"
                PreviewStylusUp="Button_PreviewStylusUp"                            StylusUp="Button_StylusUp"
                PreviewMouseLeftButtonDown="Button_PreviewMouseLeftButtonDown"      MouseLeftButtonDown="Button_MouseLeftButtonDown"
                PreviewMouseLeftButtonUp="Button_PreviewMouseLeftButtonUp"          MouseLeftButtonUp="Button_MouseLeftButtonUp"
                PreviewMouseRightButtonDown="Button_PreviewMouseRightButtonDown"    MouseRightButtonDown="Button_MouseRightButtonDown"
                PreviewMouseRightButtonUp="Button_PreviewMouseRightButtonUp"        MouseRightButtonUp="Button_MouseRightButtonUp"
            />
        </Grid>

        <Button Name="KirikaeBtn" 
                Width="150" Height="40" 
                HorizontalAlignment="Left" VerticalAlignment="Top" 
                Content="false"
                Click="IsManipulationEnabledChange"/>
    </Grid>
</Window>


화면



붉은 곳이 부모의 Grid, 노란 곳이 아이의 Grid.


결과



아이의 그리드를 손으로 터치했을 때



그 결과, 다음과 같은 출력이 되었다.
※「Button_〇〇」이 되고 있는 이벤트가, 아이의 Grid의 이벤트.
MainGrid_PreviewStylusDown
Button_PreviewStylusDown
Button_StylusDown
MainGrid_StylusDown
MainGrid_PreviewTouchDown
Button_PreviewTouchDown
Button_TouchDown
MainGrid_TouchDown
MainGrid_PreviewMouseLeftButtonDown
MainGrid_PreviewMouseDown
Button_PreviewMouseLeftButtonDown
Button_PreviewMouseDown
Button_MouseLeftButtonDown
Button_MouseDown
MainGrid_MouseLeftButtonDown
MainGrid_MouseDown
MainGrid_PreviewStylusUp
Button_PreviewStylusUp
Button_StylusUp
MainGrid_StylusUp
MainGrid_PreviewTouchUp
Button_PreviewTouchUp
Button_TouchUp
MainGrid_TouchUp
MainGrid_PreviewMouseLeftButtonUp
MainGrid_PreviewMouseUp
Button_PreviewMouseLeftButtonUp
Button_PreviewMouseUp
Button_MouseLeftButtonUp
Button_MouseUp
MainGrid_MouseLeftButtonUp
MainGrid_MouseUp

그림으로 그리면 이런 흐름.


버튼을 터치했을 때와 비교하여



버튼을 터치하면과는 다음과 같은 차이가 있었다.
  • 당연하지만 Click 이벤트가 없습니다.
  • 아이 Button을 눌렀을 때는 오지 않았다 MouseLeftButtonDown , MouseDown 의 버블링 이벤트가 온다. (Up도 마찬가지)
  • Stylus라든지 Touch계의 이벤트는 변화 없음.

  • 참고



    MS 카즈키 씨 이벤트 해설
    htps : // 코 m / 반찬 / ms / 43 98bf7107c3 710177

    좋은 웹페이지 즐겨찾기