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개의 μ’‹μ•„μš”

λ­”κ°€ λ‹Ήμ—°ν•œ κ±° 같은 λŠλ‚Œμ μΈ λŠλ‚ŒμΈλ°μš”?ㅁ?

MouseMove λŠ” λ‹¨μˆœνžˆ λ§ˆμš°μŠ€κ°€ 움직일 λ•Œ λ°œμƒν•˜λŠ” 게 μ•„λ‹ˆλΌ
Control μœ„μ—μ„œ 마우슀의 μ›€μ§μž„μ„ κ°μ§€ν–ˆμ„ λ•Œ Control 이 λ°œμƒμ‹œν‚€λŠ” κ±°μ˜ˆμš”.

view?.DragMove();

ν–ˆλ‹€λ©΄ Window ν¬ν•¨ν•œ λͺ¨λ“  Control 이 마우슀 μœ„μΉ˜λ‘œ λ™μ‹œμ— ν•¨κ»˜ 움직일텐데
그러면 λ‹Ήμ—°νžˆ Control μž…μž₯μ—μ„œλŠ” 마우슀 μ›€μ§μž„μ΄ μ—†κ² μ£ .

μ•„ λ¬Όλ‘  μƒκ°ν•˜μ‹  것도 λ¬Έμ œκ°€ λ§žκΈ΄ν•΄μš”.
DragMove() ν•˜λ©΄ dispatcher κ°€ λ©”μ‹œμ§€ νŽŒν”„λ₯Ό 직접 μˆ˜ν–‰ν•˜λ„λ‘ Native ν˜ΈμΆœμ„ μ§„ν–‰ν•˜λŠ”λ°
그게 마우슀 Left button up 이 λ“€μ–΄μ˜¬ λ•ŒκΉŒμ§€ blocking λ©λ‹ˆλ‹€.
λ‹€λ§Œ 이게 μ™„μ „νžˆ λΈ”λŸ¬ν‚Ή λ˜λŠ” 건 μ•„λ‹ˆκ³  dispatch λ₯Ό ν†΅ν•œ μ΄λ²€νŠΈλŠ” μ •μƒμ μœΌλ‘œ λ°œμƒμ„ ν•΄μš”.

κ·Έλž˜μ„œ μ •νžˆ, MouseMove 이벀트λ₯Ό μ•Œκ³  μ‹Άλ‹€λ©΄
Window 의 LocationChange 이벀트λ₯Ό μ΄μš©ν•œ νŠΈλ¦­μ„ μ‚¬μš©ν•˜κ²Œ 방법일 κ±° κ°™μ•„μš”. ~ㅁ~

3개의 μ’‹μ•„μš”
<behavior:EventTrigger EventName="MouseMove">

μ•„λž˜ μ†ŒμŠ€μ½”λ“œλ‘œ 바꿔보심이…

<behavior:EventTrigger EventName="PreviewMouseMove">
2개의 μ’‹μ•„μš”

κ°μ‚¬ν•©λ‹ˆλ‹€. λ§Žμ€ ν‚€μ›Œλ“œλ₯Ό μ£Όμ…¨λ„€μš”.

1개의 μ’‹μ•„μš”