2014-09-09 3 views
2

시각적 레이어에서 Hit Testing에 대해 아래 코드를 사용하고 있습니다. Drawing 시각적으로 그려진 선을 클릭하면 조회수를 얻고 싶습니다. 그러나 선이 좁기 때문에 나는 좋은 결과를 얻지 못하고있다.WPF의 시각적 레이어에서 히트 테스트 향상

내 마음에 오는 한 가지 해결책은 마우스를 클릭 할 때 영역을 넓히는 것입니다. 이 방법을 사용하면 라인에서 조금 더 클릭해도 마우스가 라인에 닿는 지 확인합니다.

어떻게하면됩니까? 아니면이 상황을 개선하기 위해 또 무엇을 제안합니까?

var x = MousePos.RightDown.X; 
var y = MousePos.RightDown.Y; 

var drawing = MyCanvas.GetRebarsVisual(); 

var pt = new Point(x,y); 

var result = VisualTreeHelper.HitTest(drawing, pt); 

if (result != null) 
{ 
    MessageBox.Show("You clicked on the line!"); 
} 
+2

'HitTestParameters'를 지정할 수있는 곳에서'VisualTreeHelper.HitTest'를 사용하면'pt'를 중심으로하지만'GeometryHitTestParameters'에서 전달 된 한 점보다 큰 사각형 지오메트리를 사용하십시오 : VisualTreeHelper.HitTest (drawing, null, null, new GeometryHitTestParameters (...))'. –

+0

@AdrianoRepetti 감사합니다. 방금 그 옵션을 탐색하고있었습니다. 기사 나 예제를 통해 나를 도울 수 있습니까? – Vahid

+1

코멘트에 추가 된,'new RectangleGeometry (새로운 Rect (x-2, y-2, 4, 4))'로'...'를 대체하십시오. 글쎄 ... 그냥 예를 들면. Rectangle은 가장 단순한 것이지만, 특히 터치 스크린으로 애플리케이션을 사용할 계획이라면 원이 더 큰 히트 테스트 영역을 더 잘 나타낼 것입니다. –

답변

2

를 지정할 수있는 VisualTreeHelper.HitTest() 오버로드 기능을 사용하여 HitTestParameters :

var hitRect = new Rect(x - 2, y - 2, 4, 4); 
VisualTreeHelper.HitTest(drawing, null, null, 
    new GeometryHitTestParameters(new RectangleGeometry(hitRect))); 

주 우리가를 사용 : GeometryHitTestParameters와 함께 전달 직사각형 pt 중심 구조 (그러나 더 이상의 점)을 사용 이 예에서 직사각형 형상이지만 더 좋은 근사값 (특히 터치 스크린의 경우)은 원 (EllipseGeometry)입니다.

이제는 무엇을 호출해야하는지 알지만 오버로드는 반환 값이 아니라 대신 여러 히트를 누적 할 수있는 콜백 함수를 사용합니다 (더 복잡한 규칙에 따라 하나를 선택).

htr => { 
     MessageBox.Show("You clicked on the line!"); 
     return HitTestResultBehavior.Stop; 
    }, 

당신이 자주 사용하는 경우가 더 쓸 수 있습니다 : 당신도 직접 코드를 실행할 수 있습니다

bool result = false; 
var hitRect = new Rect(x - 2, y - 2, 4, 4); 
VisualTreeHelper.HitTest(drawing, null, 
    htr => { result = true; return HitTestResultBehavior.Stop; }, 
    new GeometryHitTestParameters(new RectangleGeometry(hitRect))); 

참고 : 우리의 예에서 우리는 그래서 우리는 단지 첫 번째 히트에서 중지를 필요가 없습니다 그 일반적인 방법 (예를 들어, 사각형 크기의 선택적 매개 변수 사용).

히트 여부를 알고 싶지 않지만 어떤 객체인지 알고 싶다면 두 번째 콜백 함수 (HitTestResultCallback), 해당 매개 변수 (htr 이전 예)는 HitTestResult에서 파생 된 클래스이며 심지어 기본 클래스에 찾고있는 시각적 객체 인 VisualHit (일반 : DependencyObject)을 찾고 있습니다.

+0

코드가 잘 작동합니다. 정말 고마워요. 'found = true' 만'result = true'로 변경해야합니다. 귀하의 도움에 정말 감사드립니다. MSDN에서 많이 검색했지만 전체 예제를 찾을 수 없었습니다. 몇 가지 예를 안내해 줄 수 있습니까? – Vahid

+1

당신 말이 맞습니다! 그 방법에 관한 IMO MSDN 예제는 (비록 짧다하더라도) 꽤 좋다. 시작하려면 [this] (http://msdn.microsoft.com/library/system.windows.media.hittestresultcallback (v = vs.110) .aspx) 및 [this] (http : // msdn. microsoft.com/library/ms608753(v=vs.110).aspx). –

+0

감사합니다. Adriano,이 기사는 내가 그 해답을 더 잘 이해하는 것을 도왔습니다. – Vahid