안녕하세요. WPF에서 특정 객체가 이동되는걸 감지하는 이벤트는 없을까요??
LayoutUpdated , Window LocationChaged도 객체가 이동되는걸 감지를 못하는데
마우스 및 터치 이벤트와 상관없이 순수하게 Canvas내 Canvas가 이동될때를 마치 마우스 무브 이벤트 처
럼 감지하면 되는데 팁 부탁드립니다!
검은색과 흰색은 각각의 캔버스가 아니라 하얀색은 검은색 캔버스가 이동된걸 표현하는 겁니다.
안녕하세요. WPF에서 특정 객체가 이동되는걸 감지하는 이벤트는 없을까요??
LayoutUpdated , Window LocationChaged도 객체가 이동되는걸 감지를 못하는데
마우스 및 터치 이벤트와 상관없이 순수하게 Canvas내 Canvas가 이동될때를 마치 마우스 무브 이벤트 처
럼 감지하면 되는데 팁 부탁드립니다!
검은색과 흰색은 각각의 캔버스가 아니라 하얀색은 검은색 캔버스가 이동된걸 표현하는 겁니다.
Winforms에서 Button으로 테스트해봤는데, Button에 LocationChanged 이벤트핸들러를 등록하니, Button Location 변경시 이벤트를 감지하네요.
어떤 개체냐에 따라 다를 것 같아 질문이 포괄적인데요, 환경이랑 원하는 동작성을 공유주실 수 있나요?
안녕하세요. Winform이 아니라 wpf에서 구현을 하려고 해서요. 이상하게 LocationChanged 이벤트가 Window에서만 보이네요. 사이즈 변경 이벤트는 있던데 간단하게 생각했는데 하하;;
원하는 기능과 환경을 추가해서 글을 수정했습니다. 감사합니다!
WPF면 Canvas.Left, Canvas.Top에 바인딩을 걸고, 바인딩을 건 속성의 setter을 활용하면 되지 않을까요?
여기 답변자 분들은
@Tokhi 님의 개발 환경에 대해 1도 모르는 상태 입니다.
질문 카테고리도 포괄적인 프로그래밍 언어 Q&A고
질문 내용도 단순히 ‘객체 이동 관련 이벤트’, ‘Canvas’ 내용
가지고 윈폼환경인지 WPF환경 인지 아니면 기타 다른 웹 환경인지
알 수 가 없지 않을까요?
질문 전 가장 기본이 되는 질문자님의 개발 환경 정보에 대해 명시를 해주세요
안그러면 질문자님이나 답변자 님이나 핑퐁이 되서 불필요한 시간을 낭비 할 수 있습니다.
‘잘’ 질문 하는 방법도 하나의 실력 입니다.
네 다른분이 지적을 해주셔서 글을 수정했습니다. 너무 단순하게 생각을 했네요. 좀더 신중하게 문의글을 올려야겠습니다.
네 말씀하신바와 같이 문의글을 올리나서 다시 고민을 해보니 바인딩으로 얻는 방법이 생각나더라고요. 바인딩 말고는 이벤트로는 처리가 안되는건가봐요 ㅠㅠ
@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.");
};
호엥…?
안녕하세요. 샘플 코드까지 너무 감사드립니다. 바인딩으로 해결을 할 수 있을듯하여 적용을 해보고 있네요. 알려주신 코드는 나중에 확인을 해봐야겠습니다~! 감사합니다!!!