【问题标题】:Flex4 Right Click Spark List using ContextMenu()Flex4 使用 ContextMenu() 右键单击​​ Spark 列表
【发布时间】:2011-03-07 13:44:39
【问题描述】:

我想为一些火花列表控件添加自定义右键单击。 我尝试了以下作为项目渲染器。 (根据 flex 4 烹饪书)。

这里有完整的渲染代码http://pastebin.com/Kx8tJ1cY

当我右键单击 Spark 列表时,我只会得到 Adob​​e 默认上下文菜单。 这与我添加任何代码之前的默认行为相同。

谁能告诉我如何在 Flex 4 中添加右键单击列表项。

请,谢谢。

【问题讨论】:

  • 什么不完全有效?你看不到 ContextMenu?
  • @Florian F 默认上下文菜单始终显示。 @Jason Towne,当我得到有效答案时,我点击接受。如果我找到了自己的答案,那么我就离开它。
  • “这根本不起作用”信息不足以让我们帮助您。什么不工作?
  • 您好 Florian F,默认的 contextMenu 始终保持有效。我不确定为什么。我应该看到我添加的项目,但我没有。我还调用了没有效果的 availableFieldMenu.hideBuiltInItems()。非常感谢您提供的任何帮助,我很难过。我看到的每个示例都表明这应该可以工作,但我得到的只是默认的上下文菜单。完整的渲染代码在这里pastebin.com/Kx8tJ1cY

标签: apache-flex list flex4 contextmenu right-click


【解决方案1】:

我找到了问题/解决方案。如果有 Vboxes 或 Tab Navigator,则不能使用上下文菜单。这太疯狂了,因为这意味着我不能正确地进行相对布局或体面的可变宽度设计。

引用自:http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/ui/ContextMenu.html

例如,如果 DataGrid 控件是 TabNavigator 或 VBox 容器的子级,则 DataGrid 控件不能有自己的上下文菜单。

【讨论】:

    【解决方案2】:

    Christopher Huyler 发布了something similar(源代码available here)。来自文章:

    首先从 Google's code repository 获取 Javascript 代码。

    第 1 步 - 设置自定义上下文菜单代码

    在 Flex Builder 中创建一个新的 Flex 项目。将 rightclick.js 和 swfobject.js 复制到项目的 html-template 文件夹中。从这里开始,我不得不做出一些改变……

    • 我修改了 RightClick.init() 函数以接受对象和容器值作为输入。这允许我将应用程序的名称作为对象传递,而不是每次都调用相同的东西。
    • 我在 index.template.html 的头部包含了 rightclick.js 和 swfobject.js。
    • 我在正文中添加了一个名为“flashcontent”的新 div。
    • 我在 body 标记中添加了一个 onload 处理程序来初始化 RightClick
    • 我用新的 SWFObject(…) 替换了 AC_FL_RunContent(…),确保保留所有模板变量。

    进行这些更改后,我确认我的应用程序中没有出现右键单击上下文菜单。

    第 2 步 - 监听 rightClick 事件

    接下来,我在我的应用程序的主 mxml 文件中添加了几行,以侦听当我右键单击我的应用程序时将分派的 ExternalInterface 事件。

    private function handleCreationComplete():void
    {
        ExternalInterface.addCallback("rightClick", handleRightClick);
    }
    
    private function handleRightClick():void
    {
        Alert.show("Right Click Success!");
    }
    

    第 3 步 - 将事件分派到正确的对象

    将事件传递给主应用程序很容易,但我们实际上希望在发生右键单击事件时通知相应的子对象。由于我没有在我的应用程序中使用任何双击事件,我决定将每个右键单击事件都视为双击事件。没有两键鼠标的用户(也称为 Mac 用户)只需双击即可获得相同的菜单,而使用两键鼠标的用户只需右键单击即可。以下是我如何确保将事件分派到适当的对象。

    private function handleRightClick():void
    {
        var objects:Array = systemManager.getObjectsUnderPoint(
            new Point(mouseX,mouseY));
        if (objects.length>0)
        {
            var object:Object = objects[objects.length-1];
            var relatedObject:InteractiveObject;
            if (object is InteractiveObject)
                relatedObject = object as InteractiveObject;
            else if (object.parent && object.parent is InteractiveObject)
                relatedObject = object.parent;
            var event:MouseEvent = new MouseEvent(
                MouseEvent.DOUBLE_CLICK,true,false,mouseX,mouseY,
                relatedObject);
            object.dispatchEvent(event);
        }
    }
    

    我希望这会有所帮助!

    【讨论】:

    • 任何本地方式来获得右键工作?我真的不想用JS?
    • @Craig Mc,据我所知,所有覆盖原生右键单击功能的解决方案都涉及 javascript。如果您不想使用 javascript,总有 ContextMenus livedocs.adobe.com/flex/3/html/help.html?content=Menus_4.html。这会将菜单选项添加到默认的 Adob​​e 上下文菜单中。
    • 嗨,这就是我尝试使用的那个,ContextMenus 是我的问题,它们不显示。我总是得到默认的上下文菜单。
    猜你喜欢
    • 2011-07-20
    • 2011-06-16
    • 1970-01-01
    • 2013-06-18
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多