Wie kann ein Steuerelement einen Mausklick außerhalb dieses Steuerelements handhaben?
Schreibe ich ein benutzerdefiniertes Steuerelement, und ich möchte die Kontrolle und der Wechsel von einer Bearbeitung Staates, um es in den normalen Zustand, wenn ein Benutzer aus der Steuerung. Ich bin Umgang mit dem LostFocus-Ereignis und das hilft, wenn ein Benutzer die tabs Weg, oder wenn Sie klicken auf ein anderes Steuerelement den Fokus erhalten kann. Aber wenn Sie klicken Sie nicht auf etwas Isoliertes, wird es nicht wechseln, außer es ist bearbeitungszustand. Also ich habe zwei Lösungen im Auge:
- Zu Fuß auf den Baum, um das oberste element, wenn es geht in einen bearbeitungszustand und fügen Sie einen Ereignishandler für
MouseDownEvent
(und zu handhaben "behandelt" - Ereignisse). In der handler-ich schmeiss die Kontrolle aus der bearbeitungszustand und entfernen Sie die handler aus dem obersten element. Dies scheint ein bisschen wie ein hack, aber es würde wahrscheinlich funktionieren gut.
Beispiel-code:
private void RegisterTopMostParentMouseClickEvent()
{
_topMostParent = this.FindLastVisualAncestor<FrameworkElement>();
if ( _topMostParent == null )
return;
_topMostParent.AddHandler( Mouse.MouseDownEvent, new MouseButtonEventHandler( CustomControlMouseDownEvent ), true );
}
private void UnRegisterTopMostParentMouseClickEvent()
{
if ( _topMostParent == null )
return;
_topMostParent.RemoveHandler( Mouse.MouseDownEvent, new MouseButtonEventHandler( CustomControlMouseDownEvent ) );
_topMostParent = null;
}
- Verwenden
Mouse.PreviewMouseDownOutsideCapturedElement
und fügen Sie einen Ereignishandler zu meiner Kontrolle. In der handler-ich schmeiss die Steuerung aus dem bearbeitungszustand. Aber ich weiß nicht scheinen, um das Ereignis ausgelöst wird. Wann ist die Maus.PreviewMouseDownOutsideCapturedElement durchstarten?
Beispiel-code:
AddHandler( Mouse.PreviewMouseDownOutsideCapturedElementEvent, new MouseButtonEventHandler( EditableTextBlockPreviewMouseDownOutsideCapturedElementEvent ), true );
InformationsquelleAutor der Frage chrislarson | 2011-07-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Fangen die Maus.
Wenn ein Objekt, fängt die Maus alle Maus-bezogene Ereignisse werden behandelt, als ob das Objekt mit der Maus zu erfassen, führen Sie die Veranstaltung, auch wenn sich der Mauszeiger über einem anderen Objekt.
InformationsquelleAutor der Antwort Dmytro Laptin
Genau zu klären, die Antwort über Maus-Fokus - es war nützlich, aber ich hatte zu tun, einige weitere Graben + ausmisten über etwas bekommen, das hat tatsächlich funktioniert:
Ich war zu versuchen, so etwas wie eine combobox und benötigt ähnlich Verhalten, um aus dem drop-down zu verschwinden, wenn auf etwas anderes, ohne die Kenntnis dessen, was etwas anderes war.
Hatte ich folgende Veranstaltung für eine drop-down-Taste:
Den CaptureMode.Teilbaum heißt, Sie bekommen nur Ereignisse, die außerhalb der Kontrolle und alle Maus-Aktivität in der Kontrolle durch geführt wird um Dinge als normal. Sie haben nicht die option, um diese Enum in UIElement ist CaptureMouse, das heißt, Sie erhalten Anrufe auf HandleClickOutsideOfControl STATT-Aufrufe für alle untergeordneten Steuerelemente oder andere Hundeführer in der Kontrolle. Dies ist auch dann der Fall, wenn Sie nicht abonnieren Sie die Veranstaltungen, die Sie mit voller Maus-capture ist ein bisschen zu viel!
Würden Sie auch brauchen, um auf zu hängen + entfernen der hf auf die entsprechenden Punkte, aber ich habe Links, die hier aus Gründen der Klarheit/Präzision.
Schließlich in den handler, den Sie freigeben müssen das capture wieder.
InformationsquelleAutor der Antwort Jonny Leeds
Ich bekomme in der Regel die Eltern-Fenster, und fügen Sie eine Vorschau-handler, auch wenn Sie bereits behandelt. Manchmal, wenn MouseCapture ist nicht genug, diese Technik kommt praktisch:
InformationsquelleAutor der Antwort sam
Ich würde diesen Ansatz anders - habe das Formular mit dem Steuerelement entfernen, den Fokus von der Steuerung, wenn ein Benutzer klickt auf einen anderen Teil der form.
Die Kontrolle eigentlich lose Fokus ist viel sauberer als der Versuch, die Steuerung "simulieren" und konzentriert sich in bestimmten Situationen verloren, wenn in der Tat es nicht. Bedenken Sie, dass, wenn die Steuerung hat wirklich den Fokus verloren, es wird immer noch Dinge akzeptieren, wie Tastatureingaben.
InformationsquelleAutor der Antwort Justin