今天,我正在开发一个程序,要求我隔离用户右键单击DevExpress GalleryItem时导致的事件。在咨询了论坛和文档后,我对提供的答案感到不满意,并且#34;走开了#34;感觉有更好的答案。问题是不文档不存在,问题是这个问题的文档是脱节的,需要大量的挖掘。同样,即使在查阅了文档之后,我仍然接受了以下问题:"如何处理包含GalleryControl
的{{1}}上的右键单击事件?"
我的问题更具体一些:"如何访问位于光标下的GalleryItemGroup
?"
注意:我没有提供初始问题的代码,因为我正在回答Q& A格式的问题,即我没有代码导致我提出上述问题
答案 0 :(得分:1)
DevExpress提供了一种在这种情况下有用的工具。通常,单击事件在后台由Hit-Testing Algorithm处理,这需要一些技巧和思考(尽管算法背后的算法和逻辑相对简单)。从本质上讲,有问题的代码必须在引发事件时捕获光标的位置,并将其与显示对象的位置进行比较 - 您对该比较所做的是复杂的比特。
幸运的是,DevExpress删除了一个复杂的位,提供了一个RibbonHitInfo
对象,可以找到here的文档(我鼓励你点击一下,它很漂亮有趣的东西)。 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
对象供以后使用。
接下来,我们必须确定我们的点击与我们有兴趣访问的对象相关的位置(这里,我们正在处理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
对象,它可以与其后面的其他对象进行交互(我知道这有点过了。)
HitInfo
有许多由DevExpress提供的成员函数,可以让我们评估HitInfo
的位置;在这种情况下,我想知道HitInfo
(或PointOfClick
,确实)是否在GalleryItem
包含的GalleryControl1
对象中。因此,代码:If HitInfo.InGalleryItem Then
。通过所有的DevExpress'荣耀,RibbonHitInfo
对象检测是否 - 在点击(?)时 - 点击是在另一个对象之上;再次,在这种情况下,一个GalleryItem
对象。
如果你想要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
在这里,我可以直接访问最初找到的GalleryItem
对象"后面" PointOfClick
。返回的GalleryItem
对象和ClickedGalleryItem
都可以像使用GalleryItem
对象一样使用 - 因为它们是。{从这里,您可以访问您希望的任何属性,方法等。