私は自分の問題の答えを見てきました。正しい軌道に乗っていると思いますが、解決策を実装する方法がわかりません。私は助けが必要です。
クラス RootPackage.Utils.SelectableGraphic.as、ウィジェット RootPackage.Widgets.WidgetWithSelection.mxml、およびカスタム イベント RootPackage.Events.SelectableGraphicEvent があります。
SelectableGraphic は SelectableGraphicEvents をディスパッチし、WidgetWithSelection はそれらのイベントをリッスンします。私のイベントは次のようになります:
{
import RootPackage.utils.SelectableGraphic;
import flash.events.Event;
public class SelectableGraphicEvent extends Event
{
public static const GRAPHIC_ADDED:String = 'Graphic_Added';
public static const GRAPHIC_CLICKED:String = 'Graphic_Clicked';
private var graphic:SelectableGraphic;
public function SelectableGraphicEvent(type:String, gra:SelectableGraphic, bubbles:Boolean=false, cancelable:Boolean=false)
{
super(type, bubbles, cancelable);
graphic = gra;
}
override public function clone():Event
{
return new SelectableGraphicEvent(type, graphic, bubbles, cancelable);
}
public function get Graphic():SelectableGraphic
{
return graphic;
}
}
私のディスパッチは次のようになります。
lastDrawnGraphic = new SelectableGraphic(...);
lastDrawnGraphic.dispatchEvent(new SelectableGraphicEvent(SelectableGraphicEvent.GRAPHIC_ADDED, lastDrawnGraphic, true));
そして、私のリスニング機能は次のように見えます:
private function SelectableGraphic_ClickHandler(event:SelectableGraphicEvent):void
{
gra:SelectableGraphic = event.Graphic;
...
}
リッスン関数に入る前に、WidgetWithSelection のディスパッチと受信の間でクラッシュします。基本的なイベントをリッスンするようにリスニング関数ヘッダーを変更すると、クラッシュしませんが、event.Graphic を取得しようとすると、同じタイプの強制エラーが発生します。通常のイベントを受け取り、それを SelectableGraphicEvent にキャストして使用するなど、多くの回避策を試しました。この場合、キャスト操作は null 値を返します。
タイプ強制エラーは次のようなものです: エラー #1034: タイプ強制に失敗しました: RootPackage.Events::SelectableGraphicEvent@b56b071 を RootPackage.Events.SelectableGraphicEvent に変換できません。
とにかく、これについて少し読んだことがありますが、これらのクラスがメインアプリケーションとは異なるアプリケーションドメインにあるためか、その影響が原因である可能性があると思います。どうやらアプリケーション ドメインを変更する方法があるようですが、これを行う方法がわかりません。おそらく最後の段落からわかるように、これは現時点で混乱しています。もっと簡単な答えはありますか、それとも私が何をすべきかを誰かに説明してもらえますか?
ありがとう、
ギルマン
編集して追加:
EventListener を追加した部分です。open() は Added_To_Stage イベントにあり、 close() は Remove_From_Stage イベントにあります。
private function open():void
{
this.map.addEventListener(SelectableGraphicEvent.GRAPHIC_CLICKED, SelectableGraphic_ClickHandler);
this.map.addEventListener(SelectableGraphicEvent.GRAPHIC_ADDED, SelectableGraphic_AddedHandler);
_selectableGraphics = GetSelectableGraphics();
}
private function close():void
{
this.map.removeEventListener(SelectableGraphicEvent.GRAPHIC_CLICKED, SelectableGraphic_ClickHandler);
this.map.removeEventListener(SelectableGraphicEvent.GRAPHIC_ADDED, SelectableGraphic_AddedHandler);
ClearSelection();
}
基本的に、選択可能なグラフィックスを含むグラフィック レイヤーを含むマップがあります。そのため、SelectableGraphic からディスパッチすると、イベントはマップ (およびその先) にバブルアップします。マップはイベントをキャッチし、適切な SelectableGraphic_EventHandler を起動します。