2008-10-16 8 views
3

У меня есть требование для моего текущего проекта (приложение Flex, которое будет запущено в Flash-проигрывателе), чтобы отобразить произвольное подмножество компонентов в форме, скрывая все остальные компоненты на основе определенных аспектов состояние приложения. Существует около десятка различных текстовых полей и выпадающих списков, но некоторые становятся неактуальными на основе ранее введенных пользовательских данных, и мы не хотим отображать их, когда попадаем в эту конкретную форму. Каждый раз, когда отображается эта форма, мне может потребоваться показать любую из многих перестановок этих компонентов.Динамически размещенные компоненты Flex

Я пытаюсь решить, какой лучший способ подойти к этой проблеме. Должен ли я создать холст (или другой контейнер) со всеми необходимыми элементами управления на нем, а затем просто установить visible = false на те, которые мне не нужны? Затем возникает проблема с тем, что макет выглядит приличным. Я не хочу, чтобы там были пробелы, где скрытые элементы управления были бы.

Другой вариант, о котором я думал, - это просто механизм, который мог бы динамически создать экземпляр компонента TextInput или CheckBox и затем вызвать container.addChild (control), чтобы создать компоненты и не беспокоиться о них проблема с пробелом.

Это похоже на проблему, которая имеет идиоматическое решение в flex, но я не знаю, что это такое. Ни одна из этих идей не кажется великой, поэтому мне интересно, есть ли у кого-то еще лучшая идея.

ответ

4

Я не знаю, является ли это хорошим решением или нет, но когда я был в той же ситуации, я сделал в основном ваш первый метод. Установите visible = false, а также установите includeInLayout = false, чтобы предотвратить эти «пробелы», о которых вы говорили. Это очень простое решение, очень простое и быстрое воплощение ... возможно, кто-то еще знает что-то более идиоматическое.

+0

Это ОК решение для простого GUI-макеты. Он не очень масштабируемый и не может справиться с переходами (разборчивыми регионами и т. Д.). Я определенно рекомендую изучить «правильный» способ использования состояний. – 2008-10-16 21:13:58

+0

Сказав это, разница в наших репрезентациях свидетельствует о том, что ряд молчаливых наблюдателей не согласен со мной. Может быть, они хотели бы высказаться? :) – 2008-10-16 21:15:25

5

Лучший способ сделать это - использовать состояния. Например:

<mx:states> 
    <mx:State name="State1"> 
     <mx:AddChild position="lastChild"> 
      <components.../> 
     </mx:AddChild> 
    </mx:State> 
    <mx:State name="State2"> 
     <mx:AddChild position="lastChild"> 
      <mx:Canvas.../> 
     </mx:AddChild> 
     <mx:AddChild position="lastChild"> 
      <mx:VBox.../> 
     </mx:AddChild> 
    </mx:State> 
</mx:states> 

Затем в коде, вы звоните this.currentState = «State1» для включения первого состояния и т.д. Использование состояний, можно выборочно показать и скрыть компоненты.

Я рекомендую googling для руководств по гибким состояниям и пытаюсь выяснить, как работают штаты.

0

Если состояния не будут выполнены, ознакомьтесь с статьями, объясняющими жизненный цикл компонентов.

Если вы создаете класс, который расширяет гибкий компонент, например Canvas, вы определяете все компоненты в функции, которая переопределяет createChildren. Вы повторно макет в другой функции, которые замещают updateDisplayList

Смежные вопросы