2010-05-31 6 views
5

Ich versuche, eine schöne "Drag & Drop-Zone" in WPF zu erstellen, die in der Adorner-Ebene angezeigt wird, wenn etwas in die Hauptanwendung gezogen wird. Das Problem ist, dass ich keine Ereignisse von meinem Adorner bekomme, obwohl es gemäß der Dokumentation alle Eingabeereignisse erhalten sollte, da es sich in einer höheren Z-Reihenfolge befindet.Keine Ereignisse an WPF adorner Ebene übergeben

Um mein Problem zu debuggen, habe ich ein wirklich einfaches Beispiel erstellt, wo ich ein Benutzersteuerelement mit nur einer Schaltfläche habe. Dieses Benutzersteuerelement wird in der Adorner-Ebene angezeigt, ich kann jedoch nicht auf die Schaltfläche klicken. Warum? Was habe ich falsch gemacht?

Meine adorner Klasse ist wie folgt aufgebaut:

public ShellOverlayAdorner(UIElement element, AdornerLayer adornerLayer) 
     :base(element) 
    { 
     _adornerLayer = adornerLayer; 

     _overlayView = new AdornedElement(); 
     _overlayView.AllowDrop = true; 
     _adornerLayer.Add(this); 
    } 

und wird im Hauptfenster von

private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     adornerLayer = AdornerLayer.GetAdornerLayer(MyTopGridWithButtonInIt); 
     ShellOverlayAdorner shell = new ShellOverlayAdorner(MyTopGridWithButtonInIt, adornerLayer); 

    } 

Ich bekomme keine Ereignisse aus meiner Kontrolle überhaupt erstellt, dh keine Mausklicks , Maus über, Knopf klickt. Ich kann nicht einmal auf den Button in der Adorner-Ebene klicken. Was habe ich falsch gemacht?

+1

Es ist für mich funktioniert gut ... sind Sie sicher, dass Sie nicht IsHitTestVisible auf Ihrem adorner auf false hat gesetzt? –

+0

Hmmm .. Seltsam, weil ich das für alle Testprojekte bekomme, die ich erstelle. Nein, ich habe IsHitTestVisible nicht auf false gesetzt. Ich habe getestet, es auf beide wahr und falsch einzustellen, um eine Änderung zu erhalten, aber nichts passiert. – Johanna

Antwort

11

Ich weiß nicht, ob Sie das schon versucht haben: Wenn Sie wollen, dass das Element auf Ereignisse reagiert, denke ich, dass das Element an den visuellen Baum des Adorners gebunden werden muss. Die Art und Weise, es zu tun ist, eine an die adorner selbst oder zumindest Visual, intitialized zu verwenden, auf diese Weise es zu funktionieren scheint:

VisualCollection visualChildren; 
    FrameworkElement @object; 

    public CustomAdorner(UIElement adornedElement) : 
     base(adornedElement) 
    { 
     visualChildren = new VisualCollection(this); 
     @object = new Button {Content = "prova"}; 
     visualChildren.Add(@object); 
    } 
    protected override Visual GetVisualChild(int index) 
    { 
     return visualChildren[index]; 
    } 

diese Weise die Ereignisse korrekt weitergeleitet werden.

1

Ich hatte gerade das gleiche Problem. Nach dem Rat von MSDN sortierte es für mich:

Adorners erhalten Eingabeereignisse nur wie jedes andere FrameworkElement. Da ein adorner immer eine höhere z-Ordnung als das Element hat es ziert, die adorner empfangen Eingabeereignis (wie beispielsweise Tropfen oder Mouse), die für das darunter liegende geschmückt Element vorgesehen werden kann. Ein Adorner kann für bestimmte Eingabeereignisse abhören und diese an an das zugrunde liegende geschmückte Element durch erneut auslösen das Ereignis übergeben.

in der Durchlass getroffen Prüfung von Elementen unter einem adorner, stellte die Treffer Test IsHitTestVisible Eigenschaft auf falsch auf dem adorner zu ermöglichen.

d.h Im adorner selbst, stellen Sie sicher, IsHitTestVisible = false