2011-01-13 74 views
0

我创建了一个自定义面板控制,并想拥有但它响应鼠标移动事件,鼠标事件作出反应,当我添加事件处理程序,像这样:WPF自定义面板控制并不

Private Sub FloatingPanel_MouseMove(ByVal sender As Object, 
            ByVal e As MouseEventArgs) Handles Me.MouseMove 

End Sub 

只有当我将鼠标移动到面板中的某个子控件上时才会作出响应。无论何时将鼠标移动到自定义面板内的任何位置,我都需要让它响应。


更新: 我发现这给了我一个线索以下问题:

WPF - how to best implement a panel with draggable/zoomable children?

我可以上 GraphCanvas本身的鼠标事件,只有当它有一个 背景点

这使我简单地设置了似乎解决了问题的背景......我现在的问题是,为什么?为什么我必须设置背景才能收到mousemove事件?


更新2:下面的代码是最终解决了这个问题(见下文肯特的答案)。

Protected Overrides Function HitTestCore(ByVal hitTestParameters As System.Windows.Media.PointHitTestParameters) As System.Windows.Media.HitTestResult 
    Return New PointHitTestResult(Me, hitTestParameters.HitPoint) 
End Function 

谢谢 马特

回答

3

对于命中测试的目的,WPF的默认命中测试逻辑具有透明度的两种模式。其中一个在视觉上是透明的,并且通过命中测试(#00000000或者根本不设置背景),另一个只在视觉上透明,并且不妨碍命中测试(## 00ffffff)。你想要后者。

我相信你也可以在你的自定义Panel中覆盖UIElement.HitTestCore,这样就不需要依赖后台设置。

+0

谢谢!这是解决方案。作为参考,我在原始问题中包含了HitTestCore函数的覆盖。 –

1

我真的怀疑这可能是这里的问题;如果控件的背景为空,并且没有其他子组件,那么您的鼠标没有在控件上移动,而是在控件背后的控件上移动,因此,您不会从中获得鼠标事件(这不是非常期待的事情)尽管因为控件的边界可能会包含该区域)。

+0

同意......这确实是有道理的,但却是意想不到的。 –