2014-07-02 15 views
7

trong WPF khi sử dụng VisualTreeHelper.HitTest thậm chí cả các Phần tử bị ẩn được tìm thấy. Để bỏ qua yếu tố này và chỉ trả lại kết quả cho những người có thể nhìn thấy, tôi đã tạo ra một HitTestFilter như sau:Hành vi WPF HitTest mặc định với các thành phần Ẩn/Thu gọn

///This Filter should cut all invisible or not HitTest Enabled Elements 
private static HitTestFilterBehavior MyHitTestFilter(DependencyObject target) 
{ 
    var uiElement = target as UIElement; 
    if (uiElement != null){ 
     if(!uiElement.IsHitTestVisible || !uiElement.IsVisible)) 
      return HitTestFilterBehavior.ContinueSkipSelfAndChildren; 
    } 
    return HitTestFilterBehavior.Continue; 
} 

Lọc này làm công việc của mình, nhưng tôi muốn biết những gì mặc định WPF HitTesting làm trong trường hợp này? Liệu nó có sử dụng một bộ lọc tương tự? Có cách nào khác, có thể là lựa chọn tốt hơn cho việc này?

Để làm rõ một mô tả ngắn gọn:

Layout example

Trong hình ảnh có

  1. Một Layout container như phần tử gốc
  2. Button1 mà có thể nhìn thấy
  3. Trên Button1 là Button2 vô hình

Nếu tôi có bố cục như vậy và thực hiện một mouseclick trong vùng màu xanh lá cây của Button2, WPF bỏ qua Button2 và sự kiện nhấp xuất hiện trên Button1.

Nếu tôi thực hiện thủ công HitTesting mà không có bộ lọc được mô tả trước đó, tôi sẽ nhận được Button2 là kết quả.

Vì vậy, câu hỏi là, hành vi/bộ lọc mặc định mà WPF đang sử dụng là gì?

Cảm ơn trước vì bất kỳ đề xuất nào.

+1

Không thể tạo lại điều này cho phần tử Đã thu gọn. Và đó sẽ là kỳ lạ anyway vì họ sẽ không được đặt ra. – Clemens

+0

oh bạn nói đúng. tôi sẽ chỉnh sửa câu hỏi của tôi, tôi nghĩ rằng tôi đã thử nghiệm nó với sụp đổ. lấy làm tiếc. – sebhaub

+0

Có rất nhiều điều để giải thích về điều này. Tuy nhiên, bạn có thể nhận được một trình giải mã .Net (giống như JetBrains miễn phí dotPeek) và xem xét việc thực hiện ví dụ. phương thức UIElement.InputHitTest. – Clemens

Trả lời

3

Tôi biết đây là câu hỏi khá cũ, nhưng gần đây tôi đã gặp vấn đề tương tự và làm việc này bằng cách sử dụng phương thức UIElement.InputHitTest.

tôi thay

HitTestResult hitTest = VisualTreeHelper.HitTest(rootVisual, point); 
IInputElement source = hitTest?.VisualHit as IInputElement; 

Với

IInputElement source = rootVisual.InputHitTest(point); 

Phiên bản thứ hai bỏ qua yếu tố vô hình (trong khi người đầu tiên không).

Các vấn đề liên quan