今天,我正在编写一个程序,该程序要求我隔离用户右键单击DevExpress GalleryItem时引起的事件。在查阅了论坛和文件后,我对提供的答案感到不满意,"走开了",觉得有更好的答案。问题是而不是没有文档,问题是这件事的文档严重脱节,需要大量挖掘。同样,即使在查阅了文档之后,我仍然面临着一个问题:"如何处理包含GalleryItemGroup
s的GalleryControl
上的右键单击事件?"
我的问题更具体一点:"我如何访问位于光标下的GalleryItem
?"
注意:我不会为最初的问题提供代码,因为我正在回答问答中的问题;一种格式,即我没有导致我提出上述问题的代码
DevExpress提供了一个在这种情况下很有用的工具。通常,点击事件由点击测试算法在后台处理,这需要一些技巧和思考(尽管算法背后的算法和逻辑相对简单)。从本质上讲,有问题的代码必须在事件发生时捕捉光标的位置,并将其与显示对象的位置进行比较——如何进行比较是一个复杂的部分。
幸运的是,DevExpress去掉了复杂的部分,提供了一个RibbonHitInfo
对象,其文档可以在这里找到(我鼓励您点击一下,这是非常有趣的东西)。RibbonHitInfo
提供了许多实用程序,这些实用程序使得在比较单击和底层对象之后发生的事情变得非常容易。
该类的完全限定标识符是:
DevExpress.Xtrabars.Ribbon.ViewInfo.RibbonHitInfo
捕捉鼠标位置
首先,在触发mouseclick事件后,您必须捕获单击的位置(在这种情况下,我使用的是MouseUp
事件。以下代码需要记住两件事:第一(1),我希望隔离右键单击事件;第二(2),鼠标事件函数头格式可以在整个互联网上找到(MSDN、DevExpress、StackOverflow等)——这就是我最初使用它的地方。
Private Sub GalleryControl1_MouseRelease(ByVal sender As System.Object, ByVal MouseEvent As System.Windows.Forms.MouseEventArgs) Handles GalleryControl1.MouseUp
If e.Button = Windows.Forms.MouseButtons.Right Then
'Capture the location of the click:
Dim PointOfClick As Point = e.Location
End If
End Sub
上面的代码做了两件事:首先,If e.Button =
语句评估是哪个鼠标控件发送了事件;其次,鼠标点击的X和Y坐标被捕获为Point
对象以供稍后使用。
实例化RibbonHitInfo对象
接下来,我们必须决定我们的点击相对于我们感兴趣访问的对象的位置(这里,我们处理的是GalleryItem
对象)。DevExpress为此提供了RibbonHitInfo
类。我会显示代码,然后解释。
注意:下面的代码对上面的代码进行了添加
Private Sub GalleryControl1_MouseRelease(ByVal sender As System.Object, ByVal MouseEvent As System.Windows.Forms.MouseEventArgs) Handles GalleryControl1.MouseUp
If e.Button = Windows.Forms.MouseButtons.Right Then
'Capture the location of the click:
Dim PointOfClick As Point = e.Location
'Instantiate a RibbonHitInfo Object:
Dim HitInfo As RibbonHitInfo = GalleryControl1.CalcHitInfo(PointOfClick)
' Decide Where the PointOfClick is in Relationship to Other Objects
If HitInfo.InGalleryItem Then
' Do Something
End If
End If
End Sub
同样,上面的代码做了两(2)件事:首先,代码实例化RibbonHitInfo
对象(下面将详细解释);其次,代码通过利用可用的实用程序或成员函数来评估RibbonHitInfo
对象(实际上是PointOfClick
)的位置。
为了实例化HitInfo
,我调用.CalcHitInfo()
函数,将Point
对象传递给被调用的函数。.CalcHitInfo(aPoint)
返回,"…[在本例中]关于GalleryControl在该位置的元素的信息"。对我来说,最容易将RibbonHitInfo
对象视为Point
对象,它可以与后面的其他对象接口(我知道这有点牵强)。
CCD_ 21具有DevExpress提供的许多成员函数,这些函数允许我们评估CCD_ 22的位置;在这种情况下,我想知道HitInfo
(或者PointOfClick
,真的)是否在GalleryControl1
包含的GalleryItem
对象内。因此,代码为:If HitInfo.InGalleryItem Then
。在DevExpress的所有荣耀中,RibbonHitInfo
对象检测点击(?)时是否在另一个对象的顶部进行了点击;同样,在这种情况下,是GalleryItem
对象。
如果HitInfo在你想要的地方该怎么办
如果HitInfo
是你想要的,那么你可以做你想做的!然而,为了示例的目的(为了我的目的,访问点击下面的对象),我将提供一些代码。同样,下面的代码是对上面代码的补充(尽管这次更多的是一个片段)。
' Decide Where the PointOfClick is in Relationship to Other Objects
If HitInfo.InGalleryItem Then
' To Access The Object Behind Hit Info:
Dim ClickedGalleryItem As GalleryItem = HitInfo.GalleryItem
End If
在这里,我可以直接访问最初在PointOfClick
后面找到的GalleryItem
对象。返回的GalleryItem
对象和ClickedGalleryItem
都可以像使用GalleryItem
对象一样使用,因为它们是。从这里,您可以访问任何您想要的属性、方法等。