2009-05-23 9 views
2

私はWinformsとWPFの両方で多くのC#プログラミングを行っています。私は現在、クロスプラットフォームサポートのためにFlex/Airアプリケーションを開発中です。しかし、これは私の最初のフレックスプロジェクトなので、私は勉強しています。フレックス:ポップアップウィンドウ - [OK]または[キャンセル]を取得

ポップアップするウィンドウがあります。ユーザーはフォームに記入して、OKまたはCANCELを押します。私はC#でやったのと同じ方法で設定しましたが、うまくいきませんし、私が望むようにする方法が実際には見えません。

EDIT: は、だから私は今のイベントをしようとしている、イベントはもう一度...扱うことが

EDITは思えません。 ポップアップマネージャは、新しいインスタンスを作成するようなのでああ、それはですすでに作成したものを使用するのではなく、Formオブジェクトを使用します。

はそうSHOWWINDOW方法では、私はむしろ、ポップアップマネージャよりも、このコードに入れる:

parent.addChild(this); 

を、私はそれを閉じたときに、私はそれを削除します。唯一の問題は、ポップアップマネージャのように親の残りの部分を無効にしないことです。それに関する提案はありますか?

PARENT:

private function btnAdd_Clicked():void 
{    
     var form:Form = new Form(); 
     form.addEventListener(CloseEvent.CLOSE, onFormClosed, false, 0, true); 

     recipeForm.showWindow(this); 
} 

private function onFormClosed(e:CloseEvent):void 
{ 
    //none of these Alerts are ever shown. I also tried breakpoints in debug to try an follow the code, with no luck 
    Alert.show("Closed"); 
    if(e.detail == Alert.OK) 
    { 
     Alert.show("OK"); 
    } 
    else if(e.detail == Alert.CANCEL) 
    { 
     Alert.show("Cancel"); 
    } 
} 

CHILD:

private function btnCancel_Clicked():void 
{ 
    okClicked = false; 
    closeWindow(); 
} 

public function closeWindow():void 
{ 
    var e:CloseEvent = new CloseEvent(CloseEvent.CLOSE); 
    e.detail = okClicked ? Alert.OK : Alert.CANCEL; 
    dispatchEvent(e); 
    PopUpManager.removePopUp(this); 
} 

public function showWindow(parent:WindowedApplication):void 
{ 
    var window:IFlexDisplayObject = PopUpManager.createPopUp(parent, RecipeForm, true); 
    PopUpManager.centerPopUp(window); 
} 

答えて

3

あなたはこれを行うことができ、少なくとも2つの異なる方法:

FIRST WAY:使用してイベント

あなたのフォームクラスの派遣をしてみましょういずれかのボタンがクリックされたときのイベント。 Formが親ビューからインスタンス化された後、ディスパッチすることが分かっているイベントのeventListenerを追加します。 Formがイベントを送出すると、eventListenerが呼び出されます。 FlexのCloseEventを再利用して、「detail」プロパティを送出する前にAlert.OKまたはAlert.CANCELに設定することもできます。フォームで

:親で

var e:CloseEvent = new CloseEvent(CloseEvent.CLOSE); 
e.detail = okClicked ? Alert.OK : Alert.CANCEL; 
dispatchEvent(e); 

var f:Form = new Form(); 
f.addEventListener(CloseEvent.CLOSE, onClose, false, 0, true); 
... 
private function onClose(e:CloseEvent):void 
{ 
    if (e.detail == Alert.OK) 
     // do something 
    else if (e.detail == Alert.CANCEL) 
     // do something else 
} 

SECOND WAY:コールバック

フォームクラスにタイプ "機能" のプロパティpublic varを追加し、コールバックを供給を使用して親からの関数。基本的に#1と同じことをしますが、抽象化/間接化はほとんどありません。

Flexのイベントモデルはコールバックよりもかなりよく考えられているので、#1をお勧めします。フォームで

+0

は、これがそうですが、イベントがちょうど...取り扱われていないようです 子: パブリック関数closeWindow():無効 { \tするvar E:CloseEvent =新しいCloseEvent(CloseEvent。閉じる); \t e.detail = okClicked? Alert.OK:Alert.CANCEL; \t dispatchEvent(e); \t \t PopUpManager.removePopUp(this); }親: プライベート関数btnAddRecipe_Clicked():ボイド {\t \t \t \t \tするvar recipeForm:RecipeForm =新しいRecipeForm()。 \t recipeForm.addEventListener(CloseEvent.CLOSE、onRecipeFormClosed、false、0、true); \t \t recipeForm.showWindow(this);無効 {// が得ることはありませんが、ここで取得します...::/ } – Joel

+0

ああ、コメントはoopps ...改行を許可していません... I'LL(:CloseEvent e)のonRecipeFormClosed } プライベート関数元の投稿に編集してください。 – Joel

+0

これは、showWindow()がRecipeFormクラスの新しいインスタンスを返すようです。そのクラスにイベントリスナーをアタッチしたいとします。イベントをディスパッチするオブジェクトは、リスナーが登録されているものと同じものであることを確認する必要があります。 –

1

var e:CloseEvent = new CloseEvent(CloseEvent.CLOSE); 
e.detail = okClicked ? Alert.OK : Alert.CANCEL; 
dispatchEvent(e); 

親で:

var f:Form = new Form(); 
f.addEventListener(CloseEvent.CLOSE, onClose, false, 0, true); 
... 
private function onClose(e:CloseEvent):void 
{ 
    if (e.detail == Alert.OK) 
     // do something 
    else if (e.detail == Alert.CANCEL) 
     // do something else 
} 
0

これはまだ未解決の問題であるかどうかわかりません。私はこの全く同じ問題に遭遇し、私は何が間違っているかを考え出したと思う。少なくとも私は自分の問題のためにやった。

私はあなたがしたように正確に物を実装しました。 closeWindowに近い属性が設定されています(私はダイアログのTitleWindowを使用しています)。

したがって、上部のXを使用してウィンドウを閉じると、closeWindowが呼び出されます。また、[キャンセル]ボタンをクリックすると、closeWindowも呼び出されます。 私の問題は、クリックをキャンセルすると、closeWindowを再度呼び出すListener(おそらくそれ自身の内部リスナーを作成するclose属性を介して)によって捕捉されるように見えるCloseEventを送出することでした。私は無限ループだが、Flexがこれを好まないのかどうかはわかりません。

私の解決策は、2つの関数を作成することです.1つはXクローズウィンドウを呼び出すためのもので、もう1つは自分自身のCloseEventをディスパッチするためのキャンセルボタンです。これは私のために働くように思えた。それがあなたを助けることを願ってください。それが動作するはずのよう

関連する問題