дочерние элементы класса MXML не отображаются - PullRequest
1 голос
/ 04 марта 2011

Я работаю над простым инструментом задач / календаря, где задачи можно динамически добавлять на холст. Вот основное приложение, определенное в 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 дочерние элементы (кнопка и метка) не отображаются. Я попытался установить creationPolicy = "all" на Canvas и BorderContainer, но он все еще не работал. Я прочитал кучу постов о людях, имеющих проблемы с доступом к членам своего класса до полной загрузки класса, но все, что я хочу сделать, это УВИДЕТЬ, что Label и Button отображаются внутри BorderContainer.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 04 марта 2011

Похоже, что добавление компонента spark в mx: canvas никогда не вызывает код, необходимый для создания дочерних элементов компонента 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>
0 голосов
/ 04 марта 2011

Вам нужно переместиться из пространства имен flex 3 mx в более новое пространство имен, если вы хотите смешать элементы управления mx и spark вместе.

Вот ваш 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.

...