2010-03-07 6 views
9

के भीतर ड्रैग टाइटलविंडो को कैसे रखा जाए, मैं एक कस्टम संवाद प्रदर्शित करने के लिए एफबी 4 में पॉपअपमेनगर का उपयोग कर रहा हूं।फ्लेक्स ऐप सीमा

 
    popwin = new TitleWindow(); 
    popwin.addElement(myCustomDialog); 
    PopUpManager.addPopUp(popwin,this,false); 
    PopUpManager.centerPopUp(popwin); 

यह ऊपर पॉप TitleWindow खींचें और इसके बारे में जाना है, जब इसके ग्रे शीर्षक पट्टी फ्लेक्स एप्लिकेशन आयत की सीमा के बाहर स्थित है, और फिर पॉपअप फिर से पकड़ा नहीं जा सकता है यह बताने के लिए संभव है। शीर्षकविंडो को नीचे खींचना भी संभव है ताकि यह फ्लेक्स ऐप आयताकार के निचले किनारे के नीचे पूरी तरह से अदृश्य हो जाए। जब फ्लेक्स ऐप सीमा पूर्ण ब्राउज़र विंडो से कम होती है, और उपयोगकर्ता जल्दी से काम कर रहा है, तो इस घटना में वृद्धि होने की संभावना है। क्या कोई साधारण सेटिंग है जो इसे होने से रोकती है, या प्रोग्रामर ड्रैग ऑपरेशन के दौरान व्यवहार को रोकना चाहिए?

धन्यवाद टिम

+0

इसी प्रकार के सवाल यहां पोस्ट: http://stackoverflow.com/questions/1579117/how-to-prevent-a-component-from-being-dragged-out-of-the- चरण-में-फ्लेक्स -3 – ggkmath

उत्तर

8

अरे, वहाँ नहीं एक साधारण मेरी जानकारी से ऐसा होने से रोकने के लिए सेटिंग है। आपको बस इतना करना है कि यह हर बार चलता है और यह सुनिश्चित करता है कि यह कुछ सीमाओं के भीतर रहता है। यदि आप चाहें तो आप कुछ नियंत्रक वर्ग में ईवेंट हैंडलर को सार कर सकते हैं।

यहाँ एक बुनियादी उदाहरण है:

<?xml version="1.0" encoding="utf-8"?> 
<s:Application 
    xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:mx="library://ns.adobe.com/flex/mx" 
    creationComplete="creationCompleteHandler()"> 

    <fx:Script> 
     <![CDATA[ 
      import flash.geom.Rectangle; 
      import mx.core.FlexGlobals; 
      import mx.core.UIComponent; 
      import mx.events.MoveEvent; 
      import mx.managers.PopUpManager; 
      import spark.components.TitleWindow; 

      protected function creationCompleteHandler():void 
      { 
       var window:TitleWindow = new TitleWindow(); 
       PopUpManager.addPopUp(window, this, false); 
       PopUpManager.centerPopUp(window); 
       window.addEventListener(MoveEvent.MOVE, window_moveHandler); 
      } 

      protected function window_moveHandler(event:MoveEvent):void 
      { 
       var window:UIComponent = event.currentTarget as UIComponent; 
       var application:UIComponent = FlexGlobals.topLevelApplication as UIComponent; 
       var bounds:Rectangle = new Rectangle(0, 0, application.width, application.height); 
       var windowBounds:Rectangle = window.getBounds(application); 
       var x:Number; 
       var y:Number; 
       if (windowBounds.left <= bounds.left) 
        x = bounds.left; 
       else if (windowBounds.right >= bounds.right) 
        x = bounds.right - window.width; 
       else 
        x = window.x; 
       if (windowBounds.top <= bounds.top) 
        y = bounds.top; 
       else if (windowBounds.bottom >= bounds.bottom) 
        y = bounds.bottom - window.height; 
       else 
        y = window.y; 
       window.move(x, y); 
      } 

     ]]> 
    </fx:Script> 

</s:Application> 

आशा है कि मदद करता है, लांस

+0

इस सहायक उदाहरण के लिए धन्यवाद, लांस। – Tim

0

सिर्फ

पैकेज SmartComponants { आयात spark.components.TitleWindow वर्ग बना सकते हैं और इस कदम घटना को ओवरराइड;

public class SmartTitleWindow extends TitleWindow 
{ 
    public function SmartTitleWindow() 
    { 
     super(); 
    } 
     private static const MIN_VISIBLE:int = 50; 

     public override function move(x:Number, y:Number):void 
     { 
      var maxX:Number = stage.stageWidth - MIN_VISIBLE; 
      var maxY:Number = stage.stageHeight - MIN_VISIBLE; 

      if (x < 0) 
       x = 0; 
      else if (x > maxX) 
       x = maxX; 

      if (y < 0) 
       y = 0; 
      else if (y > maxY) 
       y = maxY; 

      super.move(x, y); 
     } 
    } 

}