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:
W obrazie jest
- układ Pojemnik elementu głównego
- Button1 która jest widoczna
- 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.
Nie można odtworzyć tego dla zwiniętych elementów. I to by było dziwne, ponieważ nie zostałyby rozłożone. – Clemens
oh masz rację. Zmienię moje pytanie, pomyślałem, że testowałem to z zawaleniem. Przepraszam. – sebhaub
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