我正在使用Flex4中的自定义上下文菜单。上下文菜单本身工作正常,但我正在寻找一种方法来判断ContextMenuEvent mouseTarget是否是一个图像。就目前而言,mouseTarget显示它是一个" [object MovieClip]"。这很奇怪,因为我的应用程序中没有影片剪辑,只有图像容器。知道发生了什么事吗?
private function openContextMenu(e:ContextMenuEvent):void {
Alert.show(e.mouseTarget.toString());// shows [object MovieClip] when it should show [Object Image]
}
由于
答案 0 :(得分:0)
所以经过几个小时的研究后,我想出了下面附带的contextMenu的项目选择事件监听器。我相信必须有更好的方法来做到这一点,但在那之前......
for(var i:int = 0; i < getObjectsUnderPoint(new Point(this.mouseX, this.mouseY)).length; i++)
{
if(getObjectsUnderPoint(new Point(this.mouseX, this.mouseY))[i].parent.parent is Image)
{
//do what I need to do
}
}
感谢NHubben的输入。这让我走上了正确看待孩子的道路。
答案 1 :(得分:0)
组件名称Image
与构成名称无关。 flex继承是:Image - SWFLoader - UIComponent - FlexSprite - [...](来自mx.controls.Image docs)。
因此,您需要做的是了解将其带入AS3环境时的实际情况。看起来它被包裹在MovieClip中以允许它在Flash的显示列表中。它看起来你必须通过装载机,但我不确定。
运行一两个测试以找出实际构成的对象:
// not foolproof, and will break on some stuff,
// so you will have to fix this as needed:
private function loopDisplay(obj:Sprite):void
{
trace(obj.name + ": " + obj);
if (obj.numChildren > 0)
{
for (var i:int = 0; i < this.numChildren; i++)
{
loopDisplay(obj.getChildAt(i));
}
}
}
如果你把它放在鼠标按下处理程序中,那么你可以看到它实际上是什么。
但是,event.target
或event.currentTarget
也应该包含菜单项对象,因此您也可以循环访问这些对象并查看其中的内容。
答案 2 :(得分:0)
您需要将Image上的mouseChildren设置为false,然后MouseEvent将引用Image:
if (event.target is Image) {
//do stuff
}