2014-07-02 25 views
7

w WPF przy użyciu VisualTreeHelper.HitTest nawet ukryte elementy zostały znalezione. Aby pominąć te elementy i tylko zwrócić wynik widocznych te, stworzyłem HitTestFilter jak następuje:Domyślne zachowanie HitTest WPF z ukrytymi/zwiniętymi elementami

///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; 
} 

Filtr ten wykonuje swoją pracę, ale lubię wiedzieć, co domyślny WPF HitTesting robi w tej sprawie? Czy używa podobnego filtra? Czy są jakieś inne, być może lepsze opcje na zrobienie tego?

Aby wyjaśnić KRÓTKI OPIS:

Layout example

W obrazie jest

  1. układ Pojemnik elementu głównego
  2. Button1 która jest widoczna
  3. Powyżej Button1 to Button2, który jest niewidoczny

Jeśli mam taki układ i wykonuję kliknięcie myszą w zielonym obszarze Button2, WPF pomija Button2, a zdarzenie click pojawia się na Button1.

Jeśli wykonam ręczny test trafień bez wcześniej opisanego filtra, otrzymam w rezultacie Button2.

Pytanie brzmi, jakie jest domyślne zachowanie/filtr używany przez WPF?

Z góry dziękuję za wszelkie sugestie.

+1

Nie można odtworzyć tego dla zwiniętych elementów. I to by było dziwne, ponieważ nie zostałyby rozłożone. – Clemens

+0

oh masz rację. Zmienię moje pytanie, pomyślałem, że testowałem to z zawaleniem. Przepraszam. – sebhaub

+0

Jest wiele rzeczy do wyjaśnienia na ten temat. Możesz jednak otrzymać dekompilator .Net (taki jak darmowy JetPrains dotPeek) i przyjrzeć się implementacji np. metoda UIElement.InputHitTest. – Clemens

Odpowiedz

3

Wiem, że jest to dość stare pytanie, ale ostatnio miałem podobny problem i działało przy użyciu metody UIElement.InputHitTest.

Wymieniłem

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

Z

IInputElement source = rootVisual.InputHitTest(point); 

Druga wersja pomija elementy niewidoczne (gdy pierwszy nie robi).