WPF - 确定鼠标是否超过UIElement

Bre*_*orn 10 wpf mouse uielement

我有一些看起来像这样的xaml标记:

<Canvas x:Name="A">
     <Canvas x:Name="B"/>
</Canvas>
Run Code Online (Sandbox Code Playgroud)

我想确定鼠标是否在CanvasB.

当我的鼠标在Canvas B上方时单击,Mouse.DirectlyOver返回Canvas A(如我所料).然后我从Canvas A获得了对Canvas B的引用,但是当我检查Canvas B的IsMouseOver属性时,它返回false.

给定上面的xaml,确定鼠标是否在Canvas B上的最佳方法是什么?

And*_*ndy 26

您可以使用IsMouseOver属性来确定鼠标是否在给定控件上:

if(this.B.IsMouseOver)
    DoSomethingNice();
Run Code Online (Sandbox Code Playgroud)

Mouse.DirectlyOver可以工作时,如果鼠标位于包含的Canvas控件上,则将返回该控件而不是Canvas自身.IsMouseOver即使在这种情况下也会正常工作.

  • 请注意,您必须在拖放操作期间手动检测 `IsMouseOver` 和 `DirectlyOver`,因为鼠标会在拖放完成之前被捕获。对于那些不知道的人,可以通过检查鼠标是否在`IsMouseOver` 的控件范围内并使用`VisualTreeHelper.HitTest` 用于`DirectlyOver` 来完成。 (2认同)

Akk*_*kku 4

我在这里找到了一个答案,应该可以帮助你:StackOverflow: WPF Ways to findcontrols

仅供参考:

我只是在寻找一种方法来查明我的鼠标是否位于我的应用程序窗口上方,我成功地使用以下方法找到了这一点:

if (Mouse.DirectlyOver != null)
    DoSomethingNice();
Run Code Online (Sandbox Code Playgroud)

在调试 Mouse.DirectlyOver 时,它似乎应该找到您的 Canvas B,因为它会查找最上面的元素 - 所以您的示例应该可以工作。它没有给我一个依赖对象,但我想你可以使用它的代码隐藏(未经测试)将它与你的画布进行比较:

if (Mouse.DirectlyOver == this.B)
    DoSomethingNice();
Run Code Online (Sandbox Code Playgroud)