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
?
Wir können einen Trigger zur Verwendung mit Elementen schreiben, die in einem ScrollViewer
enthalten sind. Hier ist eine vollständige Beispielanwendung:
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
:
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.
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
Tags und Links wpf scroll custom-controls scrollviewer