2010-12-03 6 views
9

ich einige XAML-Markup haben, die im Wesentlichen wie folgt aussieht:WPF - Feststellen, ob die Maus über einem UIElement

<Canvas x:Name="A"> 
    <Canvas x:Name="B"/> 
</Canvas> 

Ich will, um zu bestimmen, ob die Maus über Canvas ist B.

Wenn ich während klicken Meine Maus ist über Canvas B, Mouse.DirectlyOver gibt Canvas A zurück (wie ich es erwarte). Ich erhalte dann einen Verweis auf Canvas B aus Canvas A, aber wenn ich die IsMouseOver-Eigenschaft von Canvas B überprüfe, wird false zurückgegeben.

Was ist der beste Weg, um zu bestimmen, ob die Maus über Canvas B mit der obigen XAML ist?

+0

Welche Ereignisbehandlung verwenden Sie, um Ihre Überprüfung durchzuführen? Wenn ich ein MouseUp-Ereignis zu Canvas B hinzufüge, gibt Mouse.DirectlyOver Canvas B zurück. Möglicherweise helfen ein wenig mehr Informationen, Ihr Problem aufzuspüren. – Liz

+0

Sicher. Der Canvas befindet sich tatsächlich in einer ControlTemplate für ein ListBoxItem. Ich bearbeite das Auswahl-Ereignis der Listbox und führe ein Routingereignis aus, um ein Pop-up anzuzeigen, das Informationen über das angeklickte Objekt enthält. Der Code, in dem ich überprüfe, wo die Maus vorbei ist, befindet sich im Routingereignishandler. Das Ziel von all dem ist, das Pop-up nicht anzuzeigen, wenn auf den rechten Teil des Listenelements geklickt wird. Ich versuche also, diesen Teil des Listenelements mit einem Canvas zu definieren und dann zu prüfen, ob sich die Maus über diesem Teil des Elements befindet, bevor das Popup angezeigt wird. –

+0

Ich weiß, es gibt andere Möglichkeiten, dies zu tun, aber ich versuche zu vermeiden, etwas anderes als das Auswahl geändert Ereignis zu verwenden. –

Antwort

0

Haben Sie versucht, die Hintergrundfarbe von CanvasB einzustellen? Wenn es leer ist, wird standardmäßig Transparent und klicken Sie auf Ereignisse passieren es

+0

Ja, ich habe es versucht. Mein Canvas B sieht folgendermaßen aus:

+0

Ich setze es während der Entwicklung auf Rot also wusste ich mit Sicherheit, dass ich innerhalb seiner Grenzen klickte. –

+0

Ich weiß es nicht ... es funktioniert gut für mich. Ich habe ein Fenster mit einer ListBox von 2 Elementen. Die ListBox.Template ist auf 2 Canvases wie Sie gesetzt und testet das Mouse.DirectlyOver-Objekt im ListBox.SelectionChanged-Ereignis und gibt das richtige Ergebnis zurück. – Rachel

3

ich eine Antwort hier auf, dass so sollten Sie helfen: StackOverflow: WPF Ways to find controls

Just for reference:

Ich war nur der Suche nach ein Weg, um herauszufinden, ob meine Maus über meine Anwendungen Fenster ist überhaupt, und ich fand dies erfolgreich mit aus:

if (Mouse.DirectlyOver != null) 
    DoSomethingNice(); 

Während Mouse.DirectlyOver es dem Debuggen zu sein schien, dass es Ihre C gefunden haben sollte Anvas B, wie es nach dem obersten Element sucht - also sollte Ihr Beispiel funktionieren. Es hat mich nicht ein Abhängigkeitsobjekt geben, aber ich denke, man es einfach Ihre Leinwand vergleichen könnte mit diesem die Code-Behind ist (nicht getestet):

if (Mouse.DirectlyOver == this.B) 
    DoSomethingNice(); 
21

Sie können die IsMouseOver property verwenden, um festzustellen, ob sich die Maus über a wird die Steuerung oder nicht:

if(this.B.IsMouseOver) 
    DoSomethingNice(); 

Während Mouse.DirectlyOver funktionieren kann, wenn die Maus über einen von der Canvas enthaltenen Kontrolle ist, wird die Steuerung anstelle des Canvas selbst zurückgeführt werden. IsMouseOver funktioniert auch in diesem Fall ordnungsgemäß.

+0

Beachten Sie, dass Sie "IsMouseOver" und "DirectlyOver" bei Drag & Drop-Vorgängen manuell erkennen müssen, da die Maus bis zum Ende der Drop-Phase erfasst wird. Für diejenigen, die es nicht wissen, kann es getan werden, indem überprüft wird, ob sich die Maus innerhalb der Grenzen des Steuerelements für "IsMouseOver" befindet und "VisualTreeHelper.HitTest" für "DirectlyOver" verwendet. –

Verwandte Themen