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

Schreibe einen Kommentar