WPF erkennt scrollendes übergeordnetes Steuerelement

8

Stellen Sie sich vor, Sie öffnen eine WPF Popup (z. B. durch ButtonClick ). Sie haben eine ListBox direkt in Popup mit einigen Elementen, so dass Sie blättern können. Stellen Sie sich vor, dies ist Ihr Custom Control und es befindet sich in ScrollViewer .

Wenn Sie nun mit der Maus von der Popup -Oberfläche weggehen und blättern, was passiert dann? Sie scrollen nach oben und unten, aber mit dem Popup geöffnet! Und das ist das Problem.

Die Frage ist, wie man aus dem Control heraus erkennt, dass ein anderes unbekanntes Parent Control im VisualTree zu scrollen begonnen hat? und setzen Sie fortlaufend IsDropDownOpen = false ?

    
PaN1C_Showt1Me 22.02.2010, 09:19
quelle

2 Antworten

10

Wir können einen Trigger zur Verwendung mit Elementen schreiben, die in einem ScrollViewer enthalten sind. Hier ist eine vollständige Beispielanwendung:

%Vor%

Wir haben einen Button, der ein Popup öffnet und jedes Scrollen in einem Elternteil ScrollViewer bewirkt, dass die ScrollTrigger Aktionen ausgelöst werden und dann können wir das Popup schließen. Beachten Sie, dass der Trigger an Button und nicht an Popup angehängt ist. Wir können jedes nahegelegene Element verwenden, das sich im visuellen Baum befindet. Beachten Sie auch, dass wir einen anderen Trigger verwenden, um Popup zu öffnen, aber wie er geöffnet wird, ist für die ursprüngliche Frage nicht wichtig.

Hier ist die ScrollTrigger :

%Vor%

Das ScrollTrigger ist sehr einfach, es hängt nur an alle übergeordneten ScrollChanged -Ereignisse und löst alle enthaltenen Aktionen aus. Im Beispiel verwenden wir ChangePropertyAction , um Popup zu schließen.

Wenn Sie mit Verhaltensmustern nicht vertraut sind, installieren Sie das Expression Blend 4 SDK und fügen Sie diese Namespaces hinzu:

%Vor%

und fügen Sie System.Windows.Interactivity und Microsoft.Expression.Interactions Ihrem Projekt hinzu.

    
Rick Sladkey 25.01.2011, 03:36
quelle
1

Ich verstehe nicht ganz, wie Ihre Steuerelemente sind, aber können Sie nicht das Öffnen / Schließen eines Steuerelements für das Focus-Ereignis festlegen? Und wenn es den Fokus verliert, um das Popup zu schließen?  Vielleicht verstehe ich falsch, können Sie ein Code-Snippet posten?  Daniel

    
daniell 23.02.2010 15:43
quelle