객체 이동 이벤트 감지

안녕하세요. WPF에서 특정 객체가 이동되는걸 감지하는 이벤트는 없을까요??

LayoutUpdated , Window LocationChaged도 객체가 이동되는걸 감지를 못하는데

마우스 및 터치 이벤트와 상관없이 순수하게 Canvas내 Canvas가 이동될때를 마치 마우스 무브 이벤트 처

럼 감지하면 되는데 팁 부탁드립니다!

검은색과 흰색은 각각의 캔버스가 아니라 하얀색은 검은색 캔버스가 이동된걸 표현하는 겁니다.

캡처12

3 Likes

Winforms에서 Button으로 테스트해봤는데, Button에 LocationChanged 이벤트핸들러를 등록하니, Button Location 변경시 이벤트를 감지하네요.

2 Likes

어떤 개체냐에 따라 다를 것 같아 질문이 포괄적인데요, 환경이랑 원하는 동작성을 공유주실 수 있나요?

2 Likes

안녕하세요. Winform이 아니라 wpf에서 구현을 하려고 해서요. 이상하게 LocationChanged 이벤트가 Window에서만 보이네요. 사이즈 변경 이벤트는 있던데 간단하게 생각했는데 하하;;

2 Likes

원하는 기능과 환경을 추가해서 글을 수정했습니다. 감사합니다!

3 Likes

WPF면 Canvas.Left, Canvas.Top에 바인딩을 걸고, 바인딩을 건 속성의 setter을 활용하면 되지 않을까요?

2 Likes

여기 답변자 분들은

@Tokhi 님의 개발 환경에 대해 1도 모르는 상태 입니다.

질문 카테고리도 포괄적인 프로그래밍 언어 Q&A

질문 내용도 단순히 ‘객체 이동 관련 이벤트’, ‘Canvas’ 내용

가지고 윈폼환경인지 WPF환경 인지 아니면 기타 다른 웹 환경인지

알 수 가 없지 않을까요?

질문 전 가장 기본이 되는 질문자님의 개발 환경 정보에 대해 명시를 해주세요

안그러면 질문자님이나 답변자 님이나 핑퐁이 되서 불필요한 시간을 낭비 할 수 있습니다.

‘잘’ 질문 하는 방법도 하나의 실력 입니다.

5 Likes

네 다른분이 지적을 해주셔서 글을 수정했습니다. 너무 단순하게 생각을 했네요. 좀더 신중하게 문의글을 올려야겠습니다.

2 Likes

네 말씀하신바와 같이 문의글을 올리나서 다시 고민을 해보니 바인딩으로 얻는 방법이 생각나더라고요. 바인딩 말고는 이벤트로는 처리가 안되는건가봐요 ㅠㅠ

2 Likes

@aroooong 님 말씀 하시기 전에 원 글이 더 적었던지라 뭔가 싶어서 답변을 패스 하고 말았었는데… 바꾸셨군요.

var descriptor 
    = DependencyPropertyDescriptor.FromProperty( 
        Canvas.LeftProperty, typeof(대상이 되는 컨트롤[여기서는 그냥 Canvas겠네요] ) 
      );
descriptor.AddValueChanged(검정캔버스 이름, OnCanvasLeftChanged );

이렇게 잡으면 그 오브젝트가 움직일 때 OnCanvasLeftChanged로 받을 수 있습니다. Top도 마찬가지겠구요.
물론 컨트롤 자체를 만들고 이벤트를 부르는 식으로 하던지 아님 뭐 기존 값을 저장해놨다가 바뀔 때를 인식해서 Rx처럼 옵저버 느낌으로 값 변경 시에 탐지하는 식으로도 가능하겠습니다.

간단히 캔버스 수가 적다면야 극단적으로 할 수도 있겠지만 재사용성을 생각해서 별도의 캔버스를 만들어 쓰심이 좋지 않을까 싶네요.

이건 GPT형에게 예시 짜달라고 물어봤습니다.

using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;

public class CustomCanvas : Canvas
{
    // 커스텀 이벤트 선언
    public event EventHandler PositionChanged;

    public CustomCanvas()
    {
        // Canvas.Left 프로퍼티의 변경을 감지
        DependencyPropertyDescriptor leftDescriptor = DependencyPropertyDescriptor.FromProperty(Canvas.LeftProperty, typeof(Canvas));
        if (leftDescriptor != null)
        {
            leftDescriptor.AddValueChanged(this, (s, e) =>
            {
                OnPositionChanged();
            });
        }

        // Canvas.Top 프로퍼티의 변경을 감지
        DependencyPropertyDescriptor topDescriptor = DependencyPropertyDescriptor.FromProperty(Canvas.TopProperty, typeof(Canvas));
        if (topDescriptor != null)
        {
            topDescriptor.AddValueChanged(this, (s, e) =>
            {
                OnPositionChanged();
            });
        }
    }

    // 커스텀 이벤트를 발생시키는 메서드
    private void OnPositionChanged()
    {
        PositionChanged?.Invoke(this, EventArgs.Empty);
    }
}

이러면 이렇게 되겠죠. 지금은 변경 감지 이벤트가 하나지만 2개로 바꿀 수도 있겠구요.

CustomCanvas myCanvas = new CustomCanvas();
myCanvas.PositionChanged += (s, e) =>
{
    Console.WriteLine("Canvas position has changed.");
};
3 Likes

호엥…?

1 Like

안녕하세요. 샘플 코드까지 너무 감사드립니다. 바인딩으로 해결을 할 수 있을듯하여 적용을 해보고 있네요. 알려주신 코드는 나중에 확인을 해봐야겠습니다~! 감사합니다!!!