객체 이동 이벤트 감지

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

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

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

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

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

캡처12

3개의 좋아요

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

2개의 좋아요

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

2개의 좋아요

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

2개의 좋아요

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

3개의 좋아요

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

2개의 좋아요

여기 답변자 분들은

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

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

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

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

알 수 가 없지 않을까요?

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

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

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

5개의 좋아요

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

2개의 좋아요

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

2개의 좋아요

@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개의 좋아요

호엥…?

1개의 좋아요

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