1

私は自分の問題の答えを見てきました。正しい軌道に乗っていると思いますが、解決策を実装する方法がわかりません。私は助けが必要です。

クラス 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 を起動します。

4

0 に答える 0