繁体   English   中英

如何处理DevExpress GalleryItem右键单击?

[英]How to Handle DevExpress GalleryItem Right Click?

今天,我正在开发一个程序,该程序需要我隔离用户右键单击DevExpress GalleryItem时引起的事件。 在查阅了论坛和文档后,我对所提供的答案不满意,“走开”感到有更好的答案。 问题在于文档不存在,而在于此问题的文档严重分离,需要大量挖掘。 同样,即使查阅了文档,我仍然GalleryItemGroup一个问题:“如何处理包含GalleryItemGroupGalleryControl上的右键单击事件?”

我的问题更加具体:“如何访问光标下方的GalleryItem ?”

注意:我没有以问答形式回答问题时提供最初问题的代码,即我没有导致我遇到上述问题的代码

DevExpress提供了一种在这种情况下将很有帮助的工具。 通常,点击事件是通过点击测试算法在后台处理的,这需要一些技巧和思考(尽管算​​法和算法的逻辑相对简单)。 本质上,所讨论的代码必须在事件发生时捕获光标的位置,并将其与显示的对象的位置进行比较-使用该比较所做的事情很复杂。

对我们来说幸运的是,DevExpress删除了复杂的部分,提供了RibbonHitInfo对象,该对象的文档可以在这里找到(我鼓励您单击一下,这是非常有趣的东西)。 RibbonHitInfo提供了许多实用程序,使点击和底层对象的比较之后发生的事情变得非常容易。

该类的标准标识符为:

DevExpress.Xtrabars.Ribbon.ViewInfo.RibbonHitInfo

捕获鼠标位置

首先,在触发mouseclick事件之后,您必须捕获单击的位置(在这种情况下,我正在利用MouseUp事件。以下代码需要牢记两点:第一(1),我希望隔离右键单击事件;其次(2),可以在整个Internet(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对象,该对象可以与其背后的其他对象进行交互(我知道这有点RibbonHitInfo )。

HitInfo具有DevExpress提供的许多成员函数,这些函数使我们能够评估HitInfo的位置。 在这种情况下,我想知道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

在这里,我能够直接访问GalleryItem最初发现“背后”的对象PointOfClick 返回的GalleryItem对象和ClickedGalleryItem可以使用,就像它们是GalleryItem对象一样-因为它们是。 从这里,您可以访问所需的任何属性,方法等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM