我想在运行时复制flex组件。克隆flex组件
例如,如果我有这个
MX:按钮标签= “BTN” ID = “BTN” 点击= “handleClick(事件)”/>
我应该能够调用一个函数调用DuplicateComponent(),它应该返回一个UI组件,与上面的按钮完全相同,包括事件侦听器。
有人可以帮我吗? 在此先感谢
我想在运行时复制flex组件。克隆flex组件
例如,如果我有这个
MX:按钮标签= “BTN” ID = “BTN” 点击= “handleClick(事件)”/>
我应该能够调用一个函数调用DuplicateComponent(),它应该返回一个UI组件,与上面的按钮完全相同,包括事件侦听器。
有人可以帮我吗? 在此先感谢
做一个字节数组复制。此代码段应该为你做:
// ActionScript file
import flash.utils.ByteArray;
private function clone(source:Object):*
{
var myBA:ByteArray = new ByteArray();
myBA.writeObject(source);
myBA.position = 0;
return(myBA.readObject());
}
一个说明,我没有写这个代码我自己,我敢肯定我是从Flex的编码器的列表上的帖子。
您不能本机地获取UIComponents的深层副本。最好的办法是创建一个新的并分析你必须添加一个重复的设置。说实话,这听起来像是一种代码味道。我不知道是否有可能是一个更好的解决问题有点反思的..
为同一个问题:http://www.flexforum.org/viewtopic.php?f=4&t=1421
在谷歌搜索一样的东西显示出来。所以你在一个月之后削减了&粘贴相同的问题。没有运气呃?
有没有简单的方法来做到这一点,我知道。许多组件的设置都依赖于容器/上下文等等,并在创建过程中得到实例化,所以没有理由从这个角度进行克隆。
您可以在actionscript中克隆关键设置,并在创建新元素时使用这些设置。
举例来说,假设你只在乎性,你可能有一个数组[“的styleName”,“宽度”,“高度”,...],和你也许可以使用数组是这样的:
var newUI:UIComponent = new UIComponent();
for each(var s:String in propArray) {
newUI[s] = clonedUI[s];
}
如果你想在你的问题上有更多的叮咬(而不是等待一个月),告诉我们你想达到的目标。
是的格伦dats真的,我已经发布了相同的问题,因为要求是所有类似的。 我想要实现的是我有一个充当布局设计的画布,它具有一些可编辑的textareas,图像,在那里绘制的动态形状,因此在完成设计过程后,我需要预览整个布局一个单独的弹出窗口。 因此,为此,我需要克隆或复制整个布局画布,包括其子项到弹出窗口中的新画布。 所以我怎么能做到这一点。 有没有办法做同样的事情? Thanx提前。 – 2009-07-06 11:53:51
要解决这个问题,您应该使用actionscript并动态地创建按钮。
比方说,你想要的按钮(一个或多个)在一个名为“someVbox”
for (var i:uint = 0; i< 10; i++){
var but:Button = new Button();
but.label = 'some_id_'+i;
but.id = 'some_id_'+i;
but.addEventListener(MouseEvent.CLICK, 'handleClick');
someVbox.addChild(but);
}
我没有测试它的VBox去,但应增加10个按钮的VBOX有一点点运气。
mx.utils.ObjectUtil经常派上用场,但是对于复杂的对象类型,实现需要.clone()方法的接口通常是一种很好的做法,类似于克隆事件的方式。
例如:
class MyClass implements ICanvasObject
{
...
public function clone():ICanvasObject
{
var obj:MyClass = new MyClass(parameters...);
return obj;
}
}
这使你的代码更清晰和正确封装在对象如何被使用的上下文的关注/克隆。
你是对的,但根据我的理解UI组件不会被mx.utils.ObjectUtil克隆。
从:http://livedocs.adobe.com/flex/201/langref/mx/utils/ObjectUtil.html#copy()
copy()方法
公共静态函数副本(值:对象):对象 复制指定对象,并返回到副本的引用。该副本是使用本机序列化技术制作的。这意味着在复制期间将遵守自定义序列化。
此方法用于复制数据对象,如集合的元素。它不适用于复制UIComponent对象,如TextInput控件。如果要创建特定UIComponent对象的副本,则可以创建组件的子类并实现clone()方法或其他方法来执行副本。
参数value:Object - 应该复制的对象。
返回Object - 指定对象
感谢名单詹姆斯的帮助下副本,但我想实现的是,我有一个充当布局设计,具有一定的可编辑的文本域,图像,动态画布在那里绘制的形状,所以完成设计过程后,我需要在单独的弹出窗口中预览整个布局。所以为此,我需要克隆或复制整个布局画布,包括其子项到弹出窗口中的新画布。所以我怎么能做到这一点。有没有办法做同样的事情?提前感谢 – 2009-07-06 11:54:37
我得到你。如果我要创建一个预览,假设这个预览不是以任何方式交互的,那么更好的方法是创建一个包含组件的绘制图像的BitmapData对象。这将使英里更有效率和更清洁的方法。 – 2009-07-06 12:28:26
Thanx詹姆斯..这正是我想要的! 我已经通过您建议的BitmapData方法创建了对象副本: \t var bd:BitmapData = new BitmapData(layout_cnv.width,layout_cnv.height); bd.draw(layout_cnv); var ba:ByteArray; ba =(new PNGEncoder())。encode(bd); //这个下面的方法应该在弹出窗口的初始化时被调用。 Img_new.load(parentApplication.ba),其中Img_new是弹出窗口中的图像文件。 再次感谢。 – 2009-07-07 11:36:36