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

Wpf 如何确定鼠标指针离开UIElement时是否按下了鼠标按钮,wpf,vb.net,user-interface,mouse,uielement,Wpf,Vb.net,User Interface,Mouse,Uielement,我一直在使用WPF开发一个GUI,这对我来说是相当陌生的,到目前为止我只使用过Windows窗体。到目前为止,我的GUI非常简单:它包含两个矩形,每个矩形都有一个阴影。可以说,阴影创造了“漂浮在画布上”的矩形效果 当按下其中一个矩形时,将处理myRectangle.MouseDown事件,使阴影消失,从而产生矩形被按下到画布上的效果,就像按钮一样。类似地,释放鼠标按钮时,将处理myRectangle.MouseDown事件,以便阴影重新出现,矩形再次“浮动”。这种行为使它们类似于按钮。注意,我希

我一直在使用WPF开发一个GUI,这对我来说是相当陌生的,到目前为止我只使用过Windows窗体。到目前为止,我的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
,结果总是错误的。在
UIElement
Rectangle
中是否有任何布尔值的事件特别有助于我实现这一点?

MouseDown
事件中调用
myRectangle.CaptureMouse()
,这样即使鼠标移动到矩形之外,也会触发
MouseUp
,检查
MouseUp
事件中的
ismouseCapture
,查看
MouseDown
是否实际发生在矩形内,并通过
myRectangle.ReleaseMouseCapture()
释放它


要检查鼠标是否离开,您可能需要处理
MouseMove
事件,并查看鼠标是否仍在控件上方,我不确定
mouse.DirectlyOver
是否会在捕获过程中返回正确的值,我需要测试…

在您响应时,我刚刚添加了另一个注释,这对您是否有效,既然你把它标为答案?就够了。我可以很容易地接受这些。由于能够以一种方式捕获鼠标,我将在完成后发布完成的代码。