【问题标题】:WPF custom panel control doesn't respond to mouse eventsWPF 自定义面板控件不响应鼠标事件
【发布时间】:2011-09-28 00:52:13
【问题描述】:

我创建了一个自定义面板控件,并希望它响应鼠标移动事件,但是,当我添加这样的事件处理程序时:

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:以下代码最终解决了问题(请参阅下面 Kent 的回答)。

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

谢谢你, 马特

【问题讨论】:

    标签: wpf wpf-controls


    【解决方案1】:

    为了命中测试,WPF 的默认命中测试逻辑有两种透明模式。一种在视觉上和命中测试上都是透明的(#00000000 或根本不设置背景),另一种只是在视觉上透明并且不排除命中测试(##00ffffff)。你想要后者。

    我相信您也可以在您的自定义 Panel 中覆盖 UIElement.HitTestCore,这样就不需要设置背景了。

    【讨论】:

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

    我实际上怀疑这可能是这里的问题;如果控件的背景为 null 并且没有其他子组件,则您的鼠标没有在控件上移动而是在其后面的控件上移动,因此您不会从中获得鼠标事件是有道理的(这不是很预期虽然因为控件的边界可能会包围该区域)。

    【讨论】:

    • 同意...这确实有道理,但出乎意料。
    • 在我的情况下设置填充也解决了这个问题。不过我很困惑,因为我没有在 XAML 中设置填充。所以最初我点击没有填充的矩形并且什么也没发生,但总是在一段时间后我碰到我的矩形的边框然后在我的偶数处理程序中我用透明颜色填充所有矩形并且神奇地再次工作,但是它看起来控件没有响应。 “捂脸”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多