例如,我想为添加到舞台的每个BorderContainer添加一个Label子元素。 类似的东西:
// called on application preinitialize
private function preInit():void{
systemManager.stage.addEventListener(Event.ADDED, onElementAdded);
}
protected function onElementAdded(event:Event){
trace(event.target);
if(event.target && event.target is BorderContainer){
var label:Label = new Label();
label.text = "This is BorderContainer";
label.x = 10;
label.y = 10;
(event.currentTarget as BorderContainer).addElement(label);
}
}
但我得到的所有内容都是:
mouseCatcher
TestApp0
我认为它只显示已直接添加到舞台的元素 如何检测添加到应用程序阶段的所有元素?这种比较是否会影响应用程序的性能,这可能是其他一些方法吗?
答案 0 :(得分:0)
你可以尝试一个。这里不使用阶段使用FlexGlobals.topLevelApplication
实例的listen事件,而是使用ElementExistenceEvent.ELEMENT_ADD
事件,它提供了与event.element类似的元素,因此我们可以轻松完成。
它也存在性能问题,但它基于您的项目。如果不再更好,则需要删除侦听器。在确切需要时添加侦听器事件,否则删除侦听器。
private function preInit():void{
myBC.addEventListener(ElementExistenceEvent.ELEMENT_ADD,onElementAdded);
}
protected function onElementAdded(event:ElementExistenceEvent):void
{
//For the as it will return null if it is not of the type you want:
var bc:BorderContainer = event.element as BorderContainer;
if(bc){
var label:Label = new Label();
label.text = "This is BorderContainer";
label.x = 10;
label.y = 10;
BorderContainer(event.element).addElement(label);
}
else{
//other than BorderContainer no prototype chain check with is operator.
}
}
在MXML中创建自定义组件名称为BorderContainerWithLabel并将BorderContainer添加到BorderContainerWithLabel中,而不是直接添加到Applicationcontainer中。所以我们的myBC容器主动收听您的ADDED事件。这样你就可以提高性能。
<components:BorderContainerWithLabel id="myBC"/>
myBC.addElement(yourBC);
BorderContainerWithLabel.mxml
<?xml version="1.0" encoding="utf-8"?>
<s:BorderContainer xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx">
<fx:Declarations>
<!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<s:layout>
<s:VerticalLayout/>
</s:layout>
</s:BorderContainer>
答案 1 :(得分:0)
为什么在事后添加它们?创建一个扩展BorderContainer
的新类。
public class BorderContainerWithLabel extends BorderContainer {
public var label:Label;
public function BorderContainerWithLabel() {
super();
}
override protected function createChildren():void {
super.createChildren();
// create the label here. Might have to use addChild() instead of addElement()
}
override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void {
super.updateDisplatList(unscaledWidth, unscaledHeight);
// set positioning and sizing of the label here
}
}