Компоненты внутри повторителя не изменяют размеры, как ожидалось - PullRequest
1 голос
/ 03 июня 2010

У меня есть панель mxml, в которой я использую повторитель. Размер панели можно изменять по горизонтали, и я хотел бы, чтобы повторяющиеся компоненты изменяли размеры вместе с панелью. Вот упрощенный пример того, как все выглядит:

<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" ...>
    <!-- scripts and some controls -->
    <mx:VBox width="100%">
        <core:Repeater width="100%" dataProvider="model">
            <ns1:MyItemRenderer width="100%" />
        </core:Repeater>
    </mx:VBox>
</mx:TitleWindow>

При изменении размера компонента ширина повторяющихся элементов не изменяется.

Там также есть кнопки и обработчики событий, которые добавляют и удаляют элементы из модели. Когда это будет сделано, повторитель обновится, чтобы отобразить правильное количество элементов, и все элементы будут правильно изменены.

Мне не удалось изменить размеры элементов при изменении размера корневой панели. Я вижу, что VBOx вокруг ретранслятора получает событие изменения размера. Однако повторяющиеся предметы не получают событие. Я попытался передать событие изменения размера повторяющимся элементам вручную из обработчика изменения размера, который я подключил к VBox, но это не помогло.

Я также попытался добавить и удалить фиктивный элемент из ArrayCollection, который является dataProvider (потому что это вызывает правильное изменение размера в противном случае, как упомянуто выше). Однако выполнение этого в обработчике изменения размера VBox просто приводит к тому, что ретранслятор не отображается любые предметы вообще.

Есть ли какой-нибудь способ получить элементы в повторителе, чтобы изменить их размер в контейнере?

ItemRenderer, который я использую, корректно изменяет размеры при использовании в mx: List. Он построен таким образом, что он может работать как со свойством данных, установленным контейнером List, так и с getRepeaterItem () при использовании в Repeater. В этом конкретном случае я не могу использовать список в качестве контейнера из-за того, как он ведет себя в отношении управления его высотой через свойства rowCount, height и maxHeight, что не работает для меня в данном конкретном случае (я вам подробнее).

Ответы [ 2 ]

0 голосов
/ 09 июня 2010

Для записи я разобрался в следующем «решении»:

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

по существу:

<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" ...>
    <!-- scripts and some controls -->
    <mx:VBox id="outerBox" height="100%">
        <mx:VBox id="innerBox" width="100%"
                 maxHeight="{outerBox.height - innerBox.y - 40}"> 
                 <!-- reserve 40 px for the button -->
            <core:Repeater width="100%" dataProvider="model">
                <ns1:MyItemRenderer width="100%" />
            </core:Repeater>
        </mx:VBox>
        <mx:Button label="Stay Visible"/>
    </mx:VBox>
</mx:TitleWindow>
0 голосов
/ 03 июня 2010

переопределяет updateDisplayList в titleWindow и, когда высота или ширина изменяется, делает недействительным displayList для каждого элемента, созданного внутри повторителя.

Тем не менее, использование повторителей, как правило, считается плохой практикой, потому что каждый компонент внутри него отображается. Класс, основанный на списках, который использует повторное использование рендерера, считается гораздо более производительным.

Исходя из вашего сегмента кода, я не могу сказать, может ли ваш код быть переработан без повторителей или нет.

...