Flex弹出窗口定位/滚动问题

时间:2010-04-09 14:56:36

标签: flex popup

我正在尝试使用PopUpManager解决我在Flex中定位的特定问题。基本上我想要创建一个将与父容器一起滚动的弹出窗口 - 这是必要的,因为父容器很大,如果用户的浏览器窗口不够大(大多数时候都是这种情况) - 他们将不得不使用容器的滚动条向下滚动。问题是弹出窗口是相对于另一个组件定位的,它需要由该组件保留。

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">

  <mx:Script>
    <![CDATA[
      import mx.core.UITextField;
      import mx.containers.TitleWindow;
      import mx.managers.PopUpManager;

      private function clickeroo(event:MouseEvent):void {
        var popup:TitleWindow = new TitleWindow();
        popup.width = 250;
        popup.height = 300;

        popup.title = "Example";
        var tf:UITextField = new UITextField();
        tf.wordWrap = true;
        tf.width = popup.width - 30;
        tf.text = "This window stays put and doesn't scroll when the hbox is scrolled (even with using the hbox as parent in the addPopUp method), I need the popup to be local to the HBox.";
        popup.addChild(tf);

        PopUpManager.addPopUp(popup, hbox, false);
        PopUpManager.centerPopUp(popup);
      }
    ]]>
  </mx:Script>

  <mx:HBox width="100%" height="2000" id="hbox">
    <mx:Button label="Click Me" click="clickeroo(event)"/>
  </mx:HBox>

</mx:Application>

有人能给我任何正确方向的指示吗?感谢。

3 个答案:

答案 0 :(得分:2)

你正在调用“centerPopup”,这将击败addPopup中的第二个参数。根据Adobe文档,centerPopup“将弹出窗口置于调用createPopUp()或addPopUp()方法的任何窗口中。”

答案 1 :(得分:2)

PopUpManager添加了另一个独立于原始应用程序的层 因此,如果您希望它保持相对于第一层,您可能不想使用PopUpManager。你可以在Canvas上使用TitleWindow。

你可能有这个:

<mx:Application creationComplete="createPopup()">
    <mx:Script>
        <![CDATA[
            public var popupPanel:TitleWindow = new TitleWindow();

            private function createPopup():void
            {
                PopUpManager.addPopUp(popupPanel, myApp, true);
                PopUpManager.centerPopUp(popupPanel);
            }
        ]]>
    </mx:Script>

    <mx:Canvas id="myApp" width="100%" height="2000" />
</mx:Application>

但相反,你会想尝试这样的事情:

<mx:Application creationComplete="createPopup()">
    <mx:Script>
        <![CDATA[
            public var popupPanel:TitleWindow = new TitleWindow();

            private function createPopup():void
            {
                // Assuming MyApplication extends Canvas
                (myApp as Canvas).addChild(popupPanel);
                popupPanel.x = myApp.width/2;
                popupPanel.y = myApp.height/2;
            }
        ]]>
    </mx:Script>

    <mx:Canvas id="myApp" width="100%" height="2000" />
</mx:Application>

您需要自己决定应用程序的最佳x,y值。

如果你还想使这个TitleWindow可拖动/可移动,那么你可以使用Sprite.startDrag()函数。

请告诉我这是否有帮助!

答案 2 :(得分:0)

在Google中搜索相同问题时发现此帖子。我在另一个网站上找到了两个解决方他们在这里:

  

在第一个解决方案中......添加了一个监听器来响应   滚动事件的VBox,重新定位弹出窗口和另外   检测弹出窗口移出VBox边界的时间,切换   它的可见性让它看起来像“掖在VBox之下”   产卵父母滚出视野。

Full Article and Code

第二种解决方案更清洁:

  

基本上,我在我的VBox和“addChild”弹出窗口上覆盖了一个画布   画布的组件(不使用popupmanager)并滚动   画布和VBox一起。设置弹出窗口的isPopup属性   组件允许我像你一样拖动组件   弹出窗口。

Full Article and Code