WPF - 해당 이벤트를 발생시킨 구성 요소 외부에서 마우스 이벤트를 처리하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1077938

문제

문맥:

캔버스에 그림을 그리는 앱이 있습니다.예를 들어 사용자가 클릭하는 곳에 검은 점이 있습니다.그러나 기본 창 코드의 이벤트 핸들러에서 캔버스에 의해 발생된 이벤트를 처리하는 것은 제게는 보기 흉합니다.그래서 캔버스 마우스 이벤트를 미러링하는 클래스를 작성하고 이벤트 핸들러 내에서 해당 메서드를 호출합니다.

public partial class Window1 : Window
{
    DrawingTool drawTool = new DrawingTool();
    public Window1()
    {
        InitializeComponent();            
    }

    private void drawingCanvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        drawTool.OnMouseLeftButtonDown(e);
    }
}

좋은데 더 원해요...

질문:

캔버스 이벤트 핸들러를 정의하지 않고도 내 DrawingTool 클래스에서 캔버스에 의해 발생한 이벤트를 직접 처리할 수 있습니까?Window1 코드를 깔끔하게 유지하고 창 관련 내용에 집중하고 이벤트 처리를 완전히 내 클래스로 옮기고 싶습니다.

FrameworkElement에서 DrawingTool을 파생시키고 OnRender를 재정의하고 캔버스 위에 투명하게 그리면 사용자의 클릭이 캔버스에서 이루어진 것처럼 보이지만 실제로는 DrawingTool에서 발생하여 내부적으로 처리됩니다.이 접근 방식은 그리기 기능과 함께 작동합니다(그리기가 완료된 후 그려진 개체가 캔버스 하위 항목에 추가되고 DrawingTool 하위 항목에서 제거됨). 그러나 선택 모드 또는 기타 요소의 경우 요소 적중 테스트에 문제가 있습니다.

따라서 내 문제를 해결하는 방법이나 이것이 왜 어리석은 생각인지 설명하는 제안에 감사하겠습니다. :)

도움이 되었습니까?

해결책

개인 제어 필드를 공용 속성으로 노출하고 Window1 인스턴스가 있으면 다음을 수행할 수 있습니다.

Window1.DrawingCanvas.MouseLeftButtonDown += YourHandlerMethod;

다른 팁

문제가 제대로 해결되었는지 잘 모르겠고 WPF를 조금만 사용해 봤지만 캔버스가 포함된 사용자 정의 컨트롤을 만들고 거기에서 마우스를 처리하고 그리는 것은 어떻습니까?이것은 이름이 붙여질 수 있다 DrawingControl 또는 그런 것.

이렇게 하면 컨트롤을 나타내는 클래스에 그리기 코드를 포함할 수 있습니다."내부" 캔버스에 액세스할 수 있는 속성을 새 사용자 컨트롤에 제공할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top