2010-03-07 8 views
9

Ich benutze PopupManager in FB4, um ein benutzerdefiniertes Dialogfeld anzuzeigen.Wie tippe ich WindowsWindow innerhalb der Grenze der Flex App gezogen

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

Es ist möglich, die tauchte Titlewindow zu ziehen und gehen davon zu lassen, wenn seine graue Titelleiste außerhalb der Grenzen des App Rechtecks ​​Flex liegt, und dann kann das Popup nicht wieder ergriffen werden. Es ist auch möglich, das TitleWindow nach unten zu ziehen, sodass es unterhalb der unteren Kante des Flex-App-Rechtecks ​​vollständig unsichtbar wird. Wenn die Grenzen der Flex-App geringer als das gesamte Browserfenster sind und der Benutzer schnell arbeitet, steigt die Wahrscheinlichkeit, dass dies geschieht. Gibt es eine einfache Einstellung, die das verhindert, oder muss der Programmierer das Verhalten während des Ziehvorgangs abfangen?

Dank Tim

+0

ähnliche Frage hier gepostet: http://stackoverflow.com/questions/1579117/how-to-prevent-a-component-from-being-dragged-out-of-the- stage-in-flex-3 – ggkmath

Antwort

8

Hey, gibt es keine einfache Einstellung dieses von meinem Wissen geschieht zu verhindern. Alles, was Sie tun müssen, ist, es jedes Mal zu sehen, wenn es sich bewegt und sicherstellt, dass es innerhalb gewisser Grenzen bleibt. Sie könnten diesen Event-Handler dann in eine beliebige Controller-Klasse abstrahieren, wenn Sie möchten.

Hier ist ein einfaches Beispiel: Bewegungsereignis

Paket SmartComponants { Import spark.components.TitleWindow

<?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> 

Hoffnung, die Klasse Lance

+0

Vielen Dank für dieses hilfreiche Beispiel, Lance. – Tim

0

nur erstellen können und außer Kraft setzen;

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); 
     } 
    } 

}