Flex IFrame Component не отображает вне видимой области - PullRequest
1 голос
/ 04 февраля 2011

Вопрос для начинающих: я использую компонент IFrame для Flex во Flex 4. Приведенный ниже код работает, когда он помещается в верхней части области прокрутки.Однако, если я положу его ниже видимой области, он не будет отображаться.Я полный новичок в Flex.Интересно то, что когда я изменяю размер окна, когда отображается HBox, загружается Iframe.Но прокручивать его не буду.Ниже мой код.Я позаботился о том, чтобы все было видно = true, но мне кажется, что мне нужно добавить слушателя или каким-то образом обмануть его, чтобы подумать, что окно было изменено, чтобы его отобразитьКто-нибудь с идеей, как это исправить?Спасибо!

<mx:HBox visible="true" backgroundColor="#cccccc" id="facebookhbox" width="100%" height="100" horizontalAlign="center" verticalAlign="middle" verticalGap="0" verticalScrollPolicy="off">
        <mx:Canvas id="facebookcanvas" visible="true" x="0" y="0" width="650" height="80">
            <flexiframe:IFrame visible="true" y="0" x="0" id="facebookIFrame" source="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.examplelink.com&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light&amp;height=80" width="450" height="80"/>
        </mx:Canvas>
    </mx:HBox>

1 Ответ

3 голосов
/ 05 февраля 2011

Никакого опыта работы с Flex IFrame здесь только для справки, но в общих чертах вы можете сделать недействительным размер компонента или сделать недействительным список отображения, а затем вызвать validate сейчас, чтобы заставить LayoutManager пересчитать размеры элемента и его дочерних элементов ( или просто нарисуйте в случае аннулирования списка отображения):

Сложная часть, которую я вижу здесь, это выяснить, когда именно вы хотите, чтобы это произошло (то есть захват какого-то события с полосы прокрутки). В тестовых целях вы можете просто создать кнопку и в обработчике кликов сделать следующее:

facebookIFrame.invalidateSize();
facebookIFrame.invalidateDisplayList();
facebookIFrame.validateNow();

Если это сработает, вам просто нужно найти соответствующее событие в Scroller или Canvas, которое сообщит вам, когда происходит прокрутка (в худшем случае вы можете захватить указатель мыши, пометить флаг, затем захватить mouseMove и, если флаг установлен, запустить код для аннулирования / повторной проверки). В основном, как работает макет / чертеж, так это то, что UIComponents имеют флаги, которые позволяют ему знать, когда ему нужно пересчитать размер чего-либо или перерисовать его, таким образом, не всегда все перерисовывается только теми компонентами, которые в этом нуждаются. В этом случае кажется, что FacebookIFrame не становится недействительным в какой-то момент, когда он должен. Дайте мне знать, если я могу помочь больше или это не сработает.

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
                layout="vertical"
                height="100%"
                width="100%"
                xmlns:code="http://code.google.com/p/flex-iframe/"
                mouseDown="application1_mouseDownHandler(event)"
                mouseUp="application1_mouseUpHandler(event)"
                mouseMove="application1_mouseMoveHandler(event)">

    <mx:Script>
        <![CDATA[
            var isMouseDown:Boolean;
            protected function button1_clickHandler(event:MouseEvent):void
            {
                // TODO Auto-generated method stub
                facebookIFrame.invalidateSize();
                facebookIFrame.invalidateDisplayList();
                facebookIFrame.validateNow();
            }
            protected function application1_mouseDownHandler(event:MouseEvent):void
            {
                isMouseDown = true;
            }
            protected function application1_mouseUpHandler(event:MouseEvent):void
            {
                isMouseDown = false;
            }
            protected function application1_mouseMoveHandler(event:MouseEvent):void
            {
                if(isMouseDown)
                {
                    facebookIFrame.invalidateSize();
                    facebookIFrame.invalidateDisplayList();
                    facebookIFrame.validateNow();
                }
            }
        ]]>
    </mx:Script>

    <mx:Spacer height="1000"/>
    <mx:Button label="Test Invalidation"
               click="button1_clickHandler(event)"/>
    <mx:HBox visible="true" backgroundColor="#cccccc" id="facebookhbox" width="100%" height="80" horizontalAlign="center" verticalAlign="middle" verticalGap="0" verticalScrollPolicy="off">
        <mx:Canvas id="facebookcanvas" visible="true" x="0" y="0" width="650" height="80">
            <code:IFrame visible="true" y="0" x="0" id="facebookIFrame" source="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Fwww.examplelink.com&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;colorscheme=light&amp;height=80" width="450" height="80"/>
        </mx:Canvas>
    </mx:HBox>
</mx:Application>

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

Shaun

...