将容器的子项(在MXML中定义)移动到“内部容器”中

时间:2010-01-27 20:05:53

标签: flex mxml components containers

我目前正在开发一个扩展Canvas的自定义组件(我们称之为SuperCanvas);它基本上是一个让你放大和缩放的容器。平息其内容。

解释原因太长了,但是我不能使用scrollRect,所以我被迫在我的SuperCanvas中声明一个Canvas对象(名为 innerCanvas )...(我知道,不是很好= /)

我想知道是否有一种正确的方法可以在此画布中“重定向”组件子项的创建。

让我解释一下:

<comp:SuperCanvas id="superCanvas">
   <mx:Image id="img" source="image.jpg"/>
   <mx:Label id="lbl" text="Sample"/>
</comp:SuperCanvas>

有了这个,img和lbl被添加到我的SuperCanvas中。我希望将它们添加到 superCanvas.innerCanvas 中。

我无法覆盖add / removeChild方法来执行“重定向”,因为我无法添加此 innerCanvas ...

所以我尝试了这个:

<comp:SuperCanvas>
   <comp:innerCanvas>
      <mx:Image id="img" source="image.jpg"/>
      <mx:Label id="lbl" text="Sample"/>
   </comp:innerCanvas>
</comp:SuperCanvas>

但Flex抱怨“在'内容'的初始化器中:键入mx.controls.Image不能分配给目标类型mx.containers.Canvas ”。我读过我可以使用带有 [ArrayElementType] 元标记的UIComponents数组,并手动实例化对象,但我正在寻找一种更简单(也可能是正确的)解决方案。

我还看到了childDescriptor属性(其中包含MXML文件中定义的每个子对象的描述),但它是只读的,所以我无法将它传递给我的 innerCanvas

如果我不够清楚,请毫不犹豫地问我精确,英语不是我的母语,所以很难解释好的事情= /

任何帮助都会非常感激,我完全陷入困境。


编辑: 我的SuperCanvas类(减去导入和缩放和平移逻辑在这里无关紧要):

public class SuperCanvas extends Canvas
{
    public innerCanvas:Canvas = new Canvas();

    public function SuperCanvas()
    {
      super();
      addChild( innerCanvas );
    }
}

1 个答案:

答案 0 :(得分:1)

这个blog entry详细介绍了一种向SuperCanvas添加组件的方法,但是在创建之后将它们全部移动到内部画布。这就是一个解决方法。

或者,您可以将DefaultProperty设置为dataProvider - 类型对象,然后从那里将内容添加到内部画布,而不是首先将它们作为SuperCanvas的子项。

增加:

我遇到了这个blog entry,其中讨论了Panel组件以及它如何处理这个问题。您可以查看它并使用Panel源代码。