MXML类的子元素没有出现

时间:2011-03-04 16:50:02

标签: flex class mxml children instantiation

我正在开发一个简单的任务/日历工具,可以将任务动态添加到画布中。这是Main.mxml中定义的主要应用程序,它实际上只是一个Canvas和一个用于添加任务的按钮:

    <?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
    <mx:Canvas id="MainCanvas" borderStyle="solid" width="300" height="300">
        <mx:Button click="CreateTask();"  label="create task" />
    </mx:Canvas>
    <mx:Script>
    <![CDATA[
        import Task;
        private function CreateTask(  ) : void
        {
            // create the task object
            var thisTask:Task = new Task();
            // add the task to the canvas
            var taskUI : DisplayObject = MainCanvas.addChild( thisTask );
            // position the task ui
            taskUI.y = 50;
        }
    ]]>
    </mx:Script>
</mx:Application>

我希望我的任务是带有标签和按钮的BorderContainers,在外部mxml中定义,可以简单地实例化并添加到Main.mxml中的画布。这是Tasks.mxml:

<?xml version="1.0" encoding="utf-8"?>
<s:BorderContainer xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:s="library://ns.adobe.com/flex/spark" cornerRadius="10">
    <s:layout>
        <s:HorizontalLayout/>
    </s:layout>
    <s:Label id="NameLabel" text="task name" />
    <s:Button label="Button 1"/>
</s:BorderContainer>

问题在于,当我将一个Task实例添加到Canvas时,子项(按钮和标签)不会出现。我尝试在Canvas和BorderContainer上设置creationPolicy =“all”,但它仍然无效。我已经阅读了一些关于人们在完全加载类之前访问其类成员的问题的帖子,但我想要做的就是看看Label和Button在BorderContainer中显示。

感谢。

2 个答案:

答案 0 :(得分:0)

如果要将mx和spark控件混合在一起,则需要从flex 3 mx命名空间移到较新的命名空间。

这是你的main.mxml和新的mx命名空间(library://ns.adobe.com/flex/mx),并添加了fx命名空间来处理脚本块:

<?xml version="1.0" encoding="utf-8"?>
  <mx:Application 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:Script>
  <![CDATA[
      import Task;
      private function CreateTask(  ) : void
      {
          // create the task object
          var thisTask:Task = new Task();
          // add the task to the canvas
          var taskUI : DisplayObject = MainCanvas.addChild( thisTask );
          // position the task ui
          taskUI.y = 50;
      }
  ]]>
  </fx:Script>
  <mx:Canvas id="MainCanvas" borderStyle="solid" width="300" height="300">
      <mx:Button click="CreateTask();"  label="create task" />
  </mx:Canvas>
</mx:Application>

虽然正如其他人所评论的那样,你可以将所有内容都移到火花上 - 如果你这样做,请务必将addChild调用更改为addElement。

答案 1 :(得分:0)

似乎向mx:canvas添加spark组件永远不会触发创建spark组件子节点所需的代码。以下是适合您的解决方法:

<?xml version = "1.0" encoding = "utf-8"?>
<s:BorderContainer 
    xmlns:mx = "http://www.adobe.com/2006/mxml"
    xmlns:s = "library://ns.adobe.com/flex/spark"
    cornerRadius = "10"
    creationComplete = "{addElement(poorUseOfContainers)}">

    <s:HGroup id = "poorUseOfContainers"
        width = "100%" height = "100%">
        <s:Label id = "NameLabel"
            text = "task name" />
        <s:Button label = "Button 1" />
    </s:HGroup>

</s:BorderContainer>