关于Flex 的ContextMenu

PATINA 2009-04-09 05:22:17
我在使用Flex编写应用程序的过程中,遇到了下面的问题,希望能够得到大家的帮助。
1、 在编写的应用程序中需要使用右键上下文菜单,而菜单项的创建需要访问远程服务后才能确定,可是访问远程服务的过程是异步进行的,使用Flex的ContextMenu并不能等待远程服务返回结果后才显示,例如附件中的ContextMenuExample.as。
2、 为了解决1中所描述的问题,我采用了自定义的右键菜单,这种方式需要将wmode设置为opaque或者transparent,但是这样的设置就导致了某些输入法不能正确定位焦点。

我希望最好是采用自定义的右键菜单,如果输入法的问题不能解决才打算使用Flex的ContextMenu,可是不管使用那一种方式,都存在问题需要解决,希望大家能够帮助。

由于附件不能上传,将代码贴在下面。
package {
import flash.display.Sprite;
import flash.events.ContextMenuEvent;
import flash.events.TimerEvent;
import flash.text.TextField;
import flash.ui.ContextMenu;
import flash.ui.ContextMenuBuiltInItems;
import flash.ui.ContextMenuItem;
import flash.utils.Timer;

public class ContextMenuExample extends Sprite {
private var myContextMenu:ContextMenu;
private var menuLabel:String = "Reverse Colors";
private var textLabel:String = "Right Click";
private var redRectangle:Sprite;
private var label:TextField;
private var size:uint = 100;
private var black:uint = 0x000000;
private var red:uint = 0xFF0000;

public function ContextMenuExample() {
myContextMenu = new ContextMenu();
removeDefaultItems();
//addCustomMenuItems();
myContextMenu.addEventListener(ContextMenuEvent.MENU_SELECT, menuSelectHandler);

addChildren();
redRectangle.contextMenu = myContextMenu;
}

private function addChildren():void {
redRectangle = new Sprite();
redRectangle.graphics.beginFill(red);
redRectangle.graphics.drawRect(0, 0, size, size);
addChild(redRectangle);
redRectangle.x = size;
redRectangle.y = size;
label = createLabel();
redRectangle.addChild(label);
}

private function removeDefaultItems():void {
myContextMenu.hideBuiltInItems();
var defaultItems:ContextMenuBuiltInItems = myContextMenu.builtInItems;
defaultItems.print = true;
}

private function addCustomMenuItems():void {
var item:ContextMenuItem = new ContextMenuItem(menuLabel);
myContextMenu.customItems.push(item);
item.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, menuItemSelectHandler);
}

private function menuSelectHandler(event:ContextMenuEvent):void {
trace("menuSelectHandler: " + event);
// dummy call remote object.
addCustomMenuItems();
var timer:Timer = new Timer(2000, 1);
timer.addEventListener(TimerEvent.TIMER, remoteServiceHandler);
timer.start();
}

private function remoteServiceHandler(event:TimerEvent):void {
// dummy get return result from remote object.
trace("remoteServiceHandler: this object is check out.");
var item:ContextMenuItem = new ContextMenuItem("Check In");
redRectangle.contextMenu.customItems.push(item)
}

private function menuItemSelectHandler(event:ContextMenuEvent):void {
trace("menuItemSelectHandler: " + event);
var textColor:uint = (label.textColor == black) ? red : black;
var bgColor:uint = (label.textColor == black) ? black : red;
redRectangle.graphics.clear();
redRectangle.graphics.beginFill(bgColor);
redRectangle.graphics.drawRect(0, 0, size, size);
label.textColor = textColor;
}

private function createLabel():TextField {
var txtField:TextField = new TextField();
txtField.text = textLabel;
return txtField;
}
}
}
...全文
820 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
PATINA 2009-04-11
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 Kain 的回复:]
输入法到没有碰到过问题,不过全屏之后文本框就不能输入了。
[/Quote]确实存在这样的问题,另外现在Flash10的安全机制也存在变化,我们是08年上半年开始的项目,当时还Flash10的正式版本还没有发布,这段时间提交的时候发现,原来一些在Flash9的正常运行的功能,现在却不能正确的运行。需要修改与用户的交互方式,才能实现。感觉这样的问题,很让人头疼。
PATINA 2009-04-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 Kain 的回复:]
全部用左键点击一个特定的按钮出发,因为我们是在表格中的,所以这种表现方式也能接受。所以绕过去了:)
ContextMenu应该不会放开使用的,SliverLight也是这样。
[/Quote]现在的我们的应用使用上感觉同桌面应用程序没有多大的区别,有菜单栏,工具栏,也是右键菜单等。可是发现输入法存在问题,于是使用了浮动的iframe来模拟输入法的提示框,可能是由于客户的使用习惯的问题,这样方式他们比较难以接受。所以这个问题现在仍在讨论中,要不修改右键菜单的实现方式,要不就解决输入法的问题。
这个问题很郁闷啊。
Kain 2009-04-10
  • 打赏
  • 举报
回复
全部用左键点击一个特定的按钮出发,因为我们是在表格中的,所以这种表现方式也能接受。所以绕过去了:)
ContextMenu应该不会放开使用的,SliverLight也是这样。
Kain 2009-04-10
  • 打赏
  • 举报
回复
输入法到没有碰到过问题,不过全屏之后文本框就不能输入了。
PATINA 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 Kain 的回复:]
右键如果你是host到ie里面可以通过js预先拦截右键的事件处理过后再给flash处理,这样有个毛病就是全屏之后没有没用用了.我以前就是这么用效果挺好,后来发现全屏的问题就放弃了.
[/Quote]你能告诉我,你现在是采用哪一种方案实现右键菜单的吗?
PATINA 2009-04-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 Kain 的回复:]
右键如果你是host到ie里面可以通过js预先拦截右键的事件处理过后再给flash处理,这样有个毛病就是全屏之后没有没用用了.我以前就是这么用效果挺好,后来发现全屏的问题就放弃了.
[/Quote]我现在的实现方式就是这样的,但是这样做就导致输入法的提示框不能正确定位(例如微软的所有输入法及智能ABC等)
Kain 2009-04-09
  • 打赏
  • 举报
回复
右键如果你是host到ie里面可以通过js预先拦截右键的事件处理过后再给flash处理,这样有个毛病就是全屏之后没有没用用了.我以前就是这么用效果挺好,后来发现全屏的问题就放弃了.

4,329

社区成员

发帖
与我相关
我的任务
社区描述
多媒体/设计 Flex
社区管理员
  • Flex
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧