2010-04-09 108 views
1

我想解決一個具體問題,我使用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> 

任何人都可以給我指向正確的方向嗎?謝謝。

回答

2

您正在調用「centerPopup」,它會在addPopup中擊敗第二個參數。根據Adobe文檔,centerPopup「在調用createPopUp()或addPopUp()方法時使用的任何窗口的中心彈出窗口。」

+1

我很欣賞然而除去調用centerPopUp幫助還沒有做出區別(除了彈出不居中)。 – user284163 2010-04-09 17:09:23

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()函數完成此操作。

讓我知道這是否有幫助!

+0

你認爲你可以多解釋一下嗎?在畫布上使用它並使用startDrag()函數是什麼意思?我沒有拖放任何東西,我只想讓彈出窗口相對於其他滾動元素保持不變。 – user284163 2010-04-12 02:59:33

+0

我重新編輯它以作進一步解釋。這裏拿走的關鍵是使用Canvas(用於絕對位置),並使用addChild()。讓我知道這是否有幫助。 – 2010-04-26 17:35:40

0

在Google搜索相同的問題時發現此帖。我在另一個網站上找到了兩種解決方它們是:

在第一溶液...的偵聽器添加到到垂直框中的 滾動事件,其重新定位在彈出並且另外 檢測何時垂直框的邊界之外的彈出動作反應,切換 它的可見性,使其看起來「掖在」VBox,因爲它是 產卵父卷軸視線之外。

Full Article and Code

第二種解決方案是清潔器:

基本上,我覆蓋在我的垂直框的頂部上的畫布和「的addChild」彈出 部件到畫布(不使用PopUpManager中)和與VBox一起滾動 畫布。設置彈出式 組件的isPopup屬性允許我拖動組件,就像您可以彈出一個真實的 彈出式窗口一樣。

Full Article and Code