2

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

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

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

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

谢谢,麻烦您了。

4

2 回答 2

2

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

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

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

于 2011-03-16T08:46:25.277 回答
0

Christopher Huyler 发布了类似的内容(此处提供源代码)。来自文章:

首先从Google 的代码存储库中获取 Javascript 代码。

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

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

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

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

第 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);
    }
}

我希望这有帮助!

于 2011-03-09T16:12:55.613 回答