изменение размера компонентов списка при изменении dataProvider

У меня есть компонент, содержащий список, реализующий настраиваемый рендерер. Я использую этот компонент как всплывающую подсказку, сохраняя один в памяти и просто изменяя привязки данных по мере необходимости.

Примерно так, где TTComponent - это класс, расширяющий Canvas:

<s:TTComponent>
  <s:BorderContainer>
    <s:List id='lstItems' dataProvider="{data.Items}" width="50%" borderVisible="false" contentBackgroundColor="#222222">
      <s:layout>
        <s:VerticalLayout useVirtualLayout="false" requestedMinRowCount="1"/>
      </s:layout>
      <s:itemRenderer>
        <fx:Component>
          <s:ItemRenderer>
            <s:HGroup>
              <s:Label text="{data.Value}" paddingLeft="6" />
              <s:Label text="{data.Name}" />
            </s:HGroup>
          </s:ItemRenderer>
        </fx:Component>
      </s:itemRenderer>
    </s:List>        
  </s:BorderContainer>
</s:TTComponent>

Теперь код драйвера при наведении указателя мыши выглядит так:

if (tt == null) {
  tt = new TTComponent();
}
tt.data = data;
PopUpManager.addPopUp(tt, this);

И, конечно же, мышь:

PopUpManager.removePopUp(tt);

Теперь, что происходит, когда для данных, содержащих много элементов, установлено значение tt.data, размер списка увеличивается и отображается нормально. Однако после этого, если для данных, содержащих небольшое количество элементов, задано значение tt.data, компонент на мгновение отображает больше, чем нужно, а затем уменьшает свои размеры.

Я бы хотел, чтобы размер компонента изменялся до того, как он отображается, поэтому я не вижу изменения размера на экране. Есть идеи, как этого добиться?


person Jeremy    schedule 10.07.2011    source источник
comment
Где установить размер всплывающей подсказки? Где его размер поменять? Или меняется автоматически? Мне также кажется необычным смешивать компоненты MC (Canvas) с компонентами Spark.   -  person JeffryHouser    schedule 10.07.2011
comment
Кажется, что смешивание компонентов работает нормально. Размер определяется автоматически.   -  person Jeremy    schedule 10.07.2011
comment
Смешивание наборов компонентов часто работает нормально, но это необычный подход, особенно в вашем случае, когда группа, вероятно, может легко заменить Canvas. Размер определяется автоматически, вероятно, это означает, что какой-то код в одном из используемых вами компонентов определяет размер. Вы должны найти этот код и переопределить его. В этом случае я мог бы взглянуть на метод измерения TTComponent.   -  person JeffryHouser    schedule 11.07.2011
comment
Нет, не верю. Весь код написал сам, высота нигде не указана. Как ваше предложение помогает изменить размер компонента перед отображением после изменения привязки данных? Я не слежу за твоими рассуждениями.   -  person Jeremy    schedule 11.07.2011
comment
В вашем коде я вижу около полдюжины компонентов Flex Framework, которые, как я подозреваю, содержат значительный объем кода, написанного вами не вами. Контейнеры Flex используют методы Flex Component LifeCycle для определения размера и расположения своих дочерних элементов. Я полагаю, что где-то в этом коде размер всплывающего окна изменяется. Если бы я угадал; переработка метода измерения вашего пользовательского холста решит проблему. Но я просто догадываюсь. Поскольку вы не устанавливаете явный размер; обычно "родитель" компонента решает, какой его размер сделать - используя значения измеряемой высоты и измеренной ширины.   -  person JeffryHouser    schedule 11.07.2011
comment
Да, я все понимаю. Очевидно, что-то происходит с изменением размера, поскольку я нигде этого не указывал. Но как именно переработка метода измерения настраиваемого класса позволит мне скрыть компонент перед отображением? Мне кажется, что здесь вы упускаете цель. Компонент правильно изменяет размер. Я просто не хочу, чтобы пользователь видел компонент, пока изменение размера уже не произошло.   -  person Jeremy    schedule 11.07.2011
comment
Теоретически в переработанном методе измерения вы определите новый идеальный размер всплывающего окна как часть жизненного цикла компонента; и, следовательно, как часть того же события рендеринга, которое изменяет список после изменения dataProvider; таким образом не вызывая скачкообразного изменения визуального размера; а скорее изменение размера всего одним махом.   -  person JeffryHouser    schedule 11.07.2011


Ответы (1)


Во-первых, я бы посоветовал вам подумать о создании компонента один раз и просто отображать / скрывать его / перемещать при необходимости, а не использовать всплывающий менеджер. Вот как я обычно делаю что-то похожее на то, что пытаетесь сделать вы. Он будет работать лучше и, вероятно, решит эту проблему самостоятельно. Просто мысль.

Во-вторых, после того, как вы повторно привяжете к нему новые данные, попробуйте следующее:

Скажите, что нужно изменить размер:

tt.invalidateDisplayList();

Кроме того, вам может потребоваться сообщить, что вы изменили данные, обновив данные, если ArrayCollection:

data.refresh();

Дайте мне знать, если это не поможет.

person Nate    schedule 11.07.2011
comment
Сила Нейта принуждает меня. Если бы я знал, как делать то, что вы предлагаете, я бы стал. Как отображать импровизированные окна и тому подобное без использования диспетчера всплывающих окон? - person Jeremy; 11.07.2011
comment
Кстати, tt.invalidateDisplayList () не работал. Я также не смог найти вызов data.refresh (). - person Jeremy; 11.07.2011