如何处理DevExpress GalleryItem右键单击?

时间:2014-09-24 21:11:42

标签: vb.net event-handling devexpress

今天,我正在开发一个程序,要求我隔离用户右键单击DevExpress GalleryItem时导致的事件。在咨询了论坛和文档后,我对提供的答案感到不满意,并且#34;走开了#34;感觉有更好的答案。问题是文档不存在,问题是这个问题的文档是脱节的,需要大量的挖掘。同样,即使在查阅了文档之后,我仍然接受了以下问题:"如何处理包含GalleryControl的{​​{1}}上的右键单击事件?"

我的问题更具体一些:"如何访问位于光标下的GalleryItemGroup?"

注意:我没有提供初始问题的代码,因为我正在回答Q& A格式的问题,即我没有代码导致我提出上述问题

1 个答案:

答案 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对象供以后使用。

实例化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对象,它可以与其后面的其他对象进行交互(我知道这有点过了。)

HitInfo有许多由DevExpress提供的成员函数,可以让我们评估HitInfo的位置;在这种情况下,我想知道HitInfo(或PointOfClick,确实)是否在GalleryItem包含的GalleryControl1对象中。因此,代码: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

在这里,我可以直接访问最初找到的GalleryItem对象"后面" PointOfClick。返回的GalleryItem对象和ClickedGalleryItem都可以像使用GalleryItem对象一样使用 - 因为它们是。{从这里,您可以访问您希望的任何属性,方法等。