9

FB4でPopupManagerを使用して、カスタムダイアログを表示しています。

    popw​​in = new TitleWindow();
    popw​​in.addElement(myCustomDialog);
    PopUpManager.addPopUp(popwin、this、false);
    PopUpManager.centerPopUp(popwin);

ポップアップされたTitleWindowをドラッグして、灰色のタイトルバーがFlexアプリの長方形の境界の外側にあるときに離すと、ポップアップを再度取得できなくなります。TitleWindowを下にドラッグして、Flexアプリの長方形の下端の下で完全に見えなくなるようにすることもできます。Flexアプリの境界がブラウザウィンドウ全体よりも小さく、ユーザーがすばやく作業している場合、このような事態が発生する可能性が高くなります。これが起こらないようにする簡単な設定はありますか、それともプログラマーはドラッグ操作中の動作を傍受する必要がありますか?

ありがとうティム

4

2 に答える 2

8

ねえ、私の知識からこれが起こるのを防ぐための簡単な設定はありません。あなたがする必要があるのは、それが動くたびにそれを見て、それが特定の範囲内にとどまっていることを確認することです。必要に応じて、そのイベントハンドラーをいくつかのControllerクラスに抽象化できます。

基本的な例は次のとおりです。

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

お役に立てば幸い、ランス

于 2010-03-07T20:54:38.790 に答える
0

クラスを作成してmoveイベントをオーバーライドするだけです

パッケージSmartComponants{importspark.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);
        }
    }

}

于 2013-05-13T18:42:00.357 に答える