2009-07-03 3 views
0

컨텍스트 :WPF - 해당 이벤트를 발생시킨 구성 요소 외부에서 마우스 이벤트를 처리하는 방법?

캔버스에서 물건을 그리는 응용 프로그램이 있습니다. 예를 들어 사용자가 검은 점이있는 곳을 클릭합니다. 그러나 메인 윈도우 코드의 이벤트 핸들러에서 캔버스로 발생하는 이벤트를 처리하는 것은 저에게는보기 흉합니다. 그래서 캔버스 마우스 이벤트를 미러링하는 클래스를 작성하고 이벤트 핸들러 내에서 그 메소드를 호출합니다.

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 하위에서 제거됨). 그러나 선택 모드 또는 다른 경우에는 요소의 히트 테스트에 문제가 있습니다. 이 전혀 바보 같은 생각 :

답변

1

그냥 공용 속성으로 민간 제어 필드를 노출하고 왜

그래서, 난 내 문제 또는 설명을 해결하는 방법을 어떤 제안을 주셔서 감사합니다 당신은 인스턴스가있을 때 번째 윈도 당신은

Window1.DrawingCanvas.MouseLeftButtonDown += YourHandlerMethod; 
+0

그건 꽤 간단한 해결책이고 나는 그것에 대해 생각하지 않았습니다. 이벤트 스타일러를 스타일이나 영리한 대표자 부두에 배치하고 있었지만, 보통 okham의 면도기는 유용했습니다 :) Thx. – grapkulec

0

내가 바로 당신의 문제를 가지고 있는지 모르겠지만, 난 단지 WPF 조금 연주했지만, 할 수있는 방법 캔버스를 포함하는 사용자 컨트롤을 생성하고 처리에 대한 마우스와 거기 그리기? 이것은 DrawingControl 등으로 명명 될 수 있습니다.

그런 식으로 컨트롤을 나타내는 클래스에 포함 된 드로잉 코드를 가질 수 있습니다. 새 사용자 컨트롤에 "내부"캔버스에 대한 액세스를 허용하는 속성을 제공 할 수 있습니다.

+0

내 자신의 그림 컨트롤을 만들고 싶다면 그럴 것입니다. :) – grapkulec

+0

아, 그래. 만나다? 나는 당신의 문제를 올바르게 이해하지 못했습니다 .-D –

관련 문제