2010-12-03 101 views
9

我有一些XAML标记,看起来基本上是这样的:WPF - 确定是否鼠标在的UIElement

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

我想,以确定是否鼠标在Canvas B.

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

给出上面的xaml来确定鼠标是否结束画布B的最佳方法是什么?

+0

您使用什么事件处理来进行检查?如果我向画布B添加一个MouseUp事件,那么Mouse.DirectlyOver会返回Canvas B.也许多一些信息将有助于追踪您的问题。 – Liz 2010-12-03 17:14:33

+0

当然。 Canvas实际上在ListBoxItem的ControlTemplate中。我正在处理列表框的选择更改事件,并执行路由事件以显示弹出式窗口,其中详细介绍了有关单击项目的信息。检查鼠标位置的代码位于路由事件处理程序中。所有这些目标都是在点击列表项的右侧部分时不显示弹出窗口。所以我试图用画布定义列表项的那一部分,然后在显示弹出框之前检查鼠标是否在项目的那一部分上。 – 2010-12-03 17:36:18

+0

我知道还有其他方法可以做到这一点,但我试图避免使用选择更改事件以外的其他方法。 – 2010-12-03 17:38:59

回答

0

您是否尝试过设置CanvasB的背景颜色?如果留空,则默认为Transparent,然后单击事件穿过它

3

我找到了答案在这里,这样可以帮助你:StackOverflow: WPF Ways to find controls

仅供参考:

我只是寻找一个办法找出如果我的鼠标在我的应用程序窗口的一切,我成功地发现了这一点使用:

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

在调试Mouse.DirectlyOver它似乎是,它应该被发现你的C anvas B,因为它寻找最顶层的元素 - 所以你的例子应该工作。它没有给我依赖的对象,但我想你可以使用它,这是代码隐藏(未经测试)只是比较你的画布:

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

可以使用IsMouseOver property来确定鼠标在给定控制或不:

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

虽然Mouse.DirectlyOver可以正常工作,如果鼠标是在由Canvas包含一个控制,即控制将返回,而不是Canvas本身。 IsMouseOver即使在这种情况下也能正常工作。