2012-05-04 28 views
6

Tôi có một yếu tố DrawingVisual rằng rappresents một con đường mà Hình vẽ mô tả bởi syntax này:Bug trong hình học Hit-Testing

"m106,59.3c0-1.98,0,0-4.95,0.989-3.96, 0,989-13,8,3,96-20,8,4,95-6,92,0-14,8-3,96-17,8-3,96-1,98,2,97,3,96,10,9,7,91,13,8,2,97,1,98,9,89,3,96,14,8,3,96,4,95-0,989, 10.9-2.97,13.8-6.92,2.97-2.97,5.93-10.9,6.92-12.9z"

Để làm cho hình ảnh tôi sử dụng lớp MyCanvas, cung cấp chức năng lần truy cập thử nghiệm:

public class MyCanvas : Panel 
{ 
    public List<Visual> Visuals = new List<Visual>(); 
    private List<DrawingVisual> Hits = new List<DrawingVisual>(); 

    public void AddVisual(Visual Visual) 
    { 
     this.Visuals.Add(Visual); 
     base.AddVisualChild(Visual); 
     base.AddLogicalChild(Visual); 
    } 

    public List<DrawingVisual> GetVisuals(Geometry Region) 
    { 
     GeometryHitTestParameters Parameters = new GeometryHitTestParameters(Region); 
     this.Hits.Clear(); 
     HitTestResultCallback Callback = new HitTestResultCallback(this.HitTestCallBack); 
     VisualTreeHelper.HitTest(this, null, Callback, Parameters); 

     return this.Hits; 
    } 

    private HitTestResultBehavior HitTestCallBack(HitTestResult Result) 
    { 
     GeometryHitTestResult GeometryRes = (GeometryHitTestResult)Result; 
     DrawingVisual DVisual = Result.VisualHit as DrawingVisual; 

     if (DVisual != null && GeometryRes.IntersectionDetail == IntersectionDetail.FullyInside) 
      this.Hits.Add(DVisual);  

     return HitTestResultBehavior.Continue; 
    } 

    protected override Visual GetVisualChild(int Index) 
    { return this.Visuals[Index]; } 

    protected override int VisualChildrenCount { 
     get { return this.Visuals.Count; } 
    } 
} 

Khi tôi vẽ (màu đỏ) của tôi con đường này là kết quả:

Trong trường hợp kích thước của các tế bào lưới là 50x50. Bây giờ tôi cố gắng để có được hình ảnh ví dụ trong khu vực này:

MyCanvas my_canvas = new MyCanvas(); 
RectangleGeometry MyRegion = new RectangleGeometry(new Rect(50, 50, 250, 250)); 
DrawingVisual MyPath = new DrawingVisual(); 

using (DrawingContext context = MyPath.RenderOpen()) { 
    context.PushTransform(new TranslateTransform(50, 50)); 
    context.PushTransform(new ScaleTransform(2, 2)); 
    context.DrawGeometry(Brushes.Red, new Pen(), MyGeometry); 
} 

my_canvas.AddVisual(MyPath); 
List<DrawingVisual> result = my_canvas.GetVisuals(MyRegion); 

Nhưng MyPath không phải là kết quả, tại sao? Làm thế nào tôi phải làm đúng thử nghiệm hit? Cảm ơn.

+0

Bạn có kiểm tra xem Đường dẫn có bị nhấn hoàn toàn trong HitTestCallback của bạn không (đặt điểm ngắt)? Nếu có, IntersectionDetail có giá trị gì? – Clemens

+0

Tôi chỉnh sửa câu hỏi (tôi quên biến đổi) anyway: IntersectionDetail.Intersect – gliderkite

+0

@Clemens Tôi có thể đã tìm thấy [something] (http://stackoverflow.com/questions/10453095/rendertransform-vs-pushtransform). – gliderkite

Trả lời

5

Có vẻ như lần thử nghiệm xem xét vị trí của các hình dạng được áp dụng reverse order of transformations. Điều này sẽ giải thích tại sao đường dẫn của tôi chỉ được giao cắt và không phải là fully inside đối số RectangleGeometry của phương thức MyCanvas.GetVisuals.

chờ một phản ứng tốt hơn, tôi thực hiện các hit-test với một không lần truy cập thử nghiệm phương pháp, nay là một phần của MyCanvas lớp:

public List<DrawingVisual> GetVisuals(Rect Area) 
{ 
    this.Hits.Clear(); 

    foreach (DrawingVisual DVisual in this.Visuals) { 
     if (Area.Contains(DVisual.DescendantBounds)) 
      this.Hits.Add(DVisual); 
    } 

    return this.Hits; 
} 

EDIT:

Như Mike Danes (người điều hành trên diễn đàn MSDN) giải thích trong this chủ đề:

"Có thực sự có thể đây là lỗi trong thử nghiệm lần truy cập hình học không?"

Tôi chắc chắn 99% đây là lỗi. Thử nghiệm bản vẽ và lần truy cập phải sử dụng cùng một thứ tự biến đổi. Lý do nó hoạt động chính xác với TransformGroup là vì cách này bạn chỉ đẩy một biến đổi trong bối cảnh vẽ và điều này tránh được thứ tự nhân sai trong ngữ cảnh vẽ thử nghiệm. Lưu ý rằng điều này không liên quan gì đến thực tế là thứ tự được sử dụng trong TranformGroup khác với thứ tự đẩy.

+0

Bạn có thể nộp lỗi này với Microsoft ở đâu đó không? – DaveInCaz