Mouse pressing + drag + move event

안녕하세요. 개인 프로젝트 진행 중에, 마우스 이벤트에 관련되서 문의드립니다.

.net6.0, vs 2022를 사용하고 있습니다.

무엇을 하고자 하는지

현재, 마우스 버튼을 누른 상태에서 Window를 드래그할 때, MouseMove 이벤트를 발생시키려고 합니다.

현재 작성한 코드 중 문제가 되는 부분

드래그를 하면 Window가 드래깅되는 것까지는 구현을 마쳤습니다. 다음으로 구현할 사항이 드래그를 할 때, Window의 현재 좌표값을 받아오려는 테스트를 진행 중에, 마우스가 눌린 상태에서 MouseMove 이벤트가 아예 발생하지 않는 현상이 있습니다. 마우스 버튼을 누르지 않은 상태에선 이벤트 함수가 동작하고요.

프로젝트 진행 중에 Ctrl키를 누른 상태에서 MouseUp, Down 이벤트 동작을 구현할 때가 있었는데요. 제대로 동작을 하지 않는 현상이 지금 상황과 비슷한 현상인 거 같다고 생각이 됩니다.

관련된 간략한 이벤트 코드는 아래와 같습니다.

<Window>
  <behavior:Interaction.Triggers>
      <behavior:EventTrigger EventName="MouseMove">
          <behavior:CallMethodAction MethodName="OnMouseMove" TargetObject="{Binding}"/>
      </behavior:EventTrigger>
  </behavior:Interaction.Triggers>
  <Grid>
      <Grid.ColumnDefinitions>
          <ColumnDefinition Width="auto"/>
          <ColumnDefinition Width="*"/>
      </Grid.ColumnDefinitions>
      <Grid Grid.Column="0" Margin="20,0,10,0" x:Name="LogoContainer">
          <behavior:Interaction.Triggers>
              <behavior:EventTrigger EventName="MouseDown">
                  <behavior:CallMethodAction MethodName="OnMouseDown" TargetObject="{Binding}"/>
              </behavior:EventTrigger>
          </behavior:Interaction.Triggers>
          <Image Source="{DynamicResource Logo}" Height="20"/>
      </Grid>
  </Grid>
</Window>
/// <summary>
/// 마우스를 클릭하면 마우스 포인터를 Grabbing으로 바꾸고 드래그한다.
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
public void OnMouseDown(object sender, MouseButtonEventArgs e)
{
    if (e.LeftButton != MouseButtonState.Pressed) return;
    if (sender is not Grid logoContainer) return;

    if (isMouseEnter)
    {
        // 마우스 커서를 Grabbing으로 바꾸기
    }

    if (view is null) // view는 Window 객체
    {
        // view = 찾은 윈도우 객체
    }

    view?.DragMove();
}

// 동작이 되지 않는 이벤트 함수
public void OnMouseMove(object sender, MouseEventArgs e)
{
    if (sender is not Window window) return;
    if (!isMouseEnter) return;
    if (e.LeftButton != MouseButtonState.Pressed) return;

    System.Diagnostics.Debug.WriteLine($"" +
        $"ML: {SystemParameters.WorkArea.Left}, WL: {window.Left}");
}

추측이 되는 건, view?.DragMove()가 실행이 되면 드래그가 될 때동안 코드가 다음으로 넘어가지 않아서 OnMouseMove()가 실행이 되지 않는 것 같다고 생각됩니다.

기대하는 동작

마우스 버튼이 눌린 상태로 드래그하는 중에 mousemove 이벤트를 동작시키고 싶습니다.

전체 코드는 아래의 링크에 있습니다. 긴 글 읽어주셔서 감사합니다.
전체 코드

2 Likes

뭔가 당연한 거 같은 느낌적인 느낌인데요?ㅁ?

MouseMove 는 단순히 마우스가 움직일 때 발생하는 게 아니라
Control 위에서 마우스의 움직임을 감지했을 때 Control 이 발생시키는 거예요.

view?.DragMove();

했다면 Window 포함한 모든 Control 이 마우스 위치로 동시에 함께 움직일텐데
그러면 당연히 Control 입장에서는 마우스 움직임이 없겠죠.

아 물론 생각하신 것도 문제가 맞긴해요.
DragMove() 하면 dispatcher 가 메시지 펌프를 직접 수행하도록 Native 호출을 진행하는데
그게 마우스 Left button up 이 들어올 때까지 blocking 됩니다.
다만 이게 완전히 블러킹 되는 건 아니고 dispatch 를 통한 이벤트는 정상적으로 발생을 해요.

그래서 정히, MouseMove 이벤트를 알고 싶다면
Window 의 LocationChange 이벤트를 이용한 트릭을 사용하게 방법일 거 같아요. ~ㅁ~

3 Likes
<behavior:EventTrigger EventName="MouseMove">

아래 소스코드로 바꿔보심이…

<behavior:EventTrigger EventName="PreviewMouseMove">
2 Likes

감사합니다. 많은 키워드를 주셨네요.

1 Like