如何确定当鼠标指针离开UIElement时是否按下了鼠标按钮

时间:2011-04-06 19:14:51

标签: wpf vb.net user-interface mouse uielement

我一直在使用WPF中的GUI,我很新,直到现在才使用Windows Forms。到目前为止,我的GUI非常简单:它包含两个矩形,每个矩形都会留下一个阴影。阴影创造了一种“漂浮在画布上方”的矩形效果,可以这么说。

当按下其中一个矩形时,处理myRectangle.MouseDown事件以使阴影消失,从而产生将矩形按下到画布上的效果,如按钮。类似地,当释放鼠标按钮时,处理myRectangle.MouseDown事件,使阴影重新出现,矩形再次“浮动”。这种行为使它们类似于按钮。请注意,我希望它们是矩形而不是自定义按钮。

以下是我上面描述的一些代码:

Private Sub RectangleMouseDown(ByVal sender As Object, _
                               ByVal e As System.Windows.Input.MouseButtonEventArgs)
    Dim effectNoShadow As New Effects.DropShadowEffect
    effectNoShadow.Opacity = 0
    CType(sender, Rectangle).Effect = effectNoShadow
End Sub

Private Sub RectangleMouseUp(ByVal sender As Object, _
                             ByVal e As System.Windows.Input.MouseButtonEventArgs)
    Dim effectDropShadow As New Effects.DropShadowEffect
    effectDropShadow.Opacity = 1
    effectDropShadow.BlurRadius = 10
    effectDropShadow.ShadowDepth = 5
    CType(sender, Rectangle).Effect = effectDropShadow
End Sub

Private Sub AddHandlersToRectangles()
    For Each element As UIElement In MainGrid.Children
        If TypeOf element Is Rectangle Then                'If element is a Rectangle'
            AddHandler CType(element, Rectangle).MouseDown, AddressOf RectangleMouseDown
            AddHandler CType(element, Rectangle).MouseUp, AddressOf RectangleMouseUp
        End If
    Next
End Sub

到目前为止一切顺利。我遇到问题的一个场景是,当鼠标按钮仍然按下时鼠标光标离开矩形时,矩形停留是永久的“按下”状态,因为很明显,按钮没有在矩形上方释放

有办法解决这个问题吗?我想看到的行为如下:

  • 如果指针在按下鼠标按钮时离开矩形,我会想要重新出现阴影。这可以说是简单的,因为从理论上讲,在这种情况下,任何时候myRectangle.MouseLeave都会被提升,阴影应该重新开启,即使它已经存在。
  • 如果指针在按下鼠标按钮时留下一个矩形,然后在按钮释放之前返回,我希望阴影再次消失。这个是给我带来问题的。不知道怎么做。

我尝试了myRectangle.IsMouseCaptured,这总是错误的。在UIElementRectangle中是否有任何布尔值事件会对我有所帮助?

1 个答案:

答案 0 :(得分:3)

myRectangle.CaptureMouse()事件中致电MouseDown,即使鼠标移出矩形,MouseUp也会被触发,在IsMouseCaptured中检查MouseUp } event以查看MouseDown是否实际发生在矩形内并通过myRectangle.ReleaseMouseCapture()释放。

要检查鼠标是否正在离开,您可能会处理MouseMove事件并查看鼠标是否仍在控件之上,我不确定Mouse.DirectlyOver在捕获期间是否会返回正确的值我需要测试一下......