2

いくつかのスパークリストコントロールにカスタム右クリックを追加したいと思います。アイテムレンダラーとして以下を試しました。(フレックス4クックブックによる)。

完全なレンダリングコードはこちらhttp://pastebin.com/Kx8tJ1cY

Sparkリストを右クリックすると、Adobeのデフォルトコンテキストメニューが表示されます。これは、コードを追加する前のデフォルトの動作と同じです。

Flex4のリストアイテムに右クリックを追加する方法を教えてもらえますか。

どうぞよろしくお願いします。

4

2 に答える 2

2

問題/解決策を見つけました。Vbox またはタブ ナビゲーターがある場合、コンテキスト メニューを使用できません。これは、相対レイアウトを適切に行うことができないか、適切な可変幅のデザインを行うことができないことを意味するため、正気ではありません。

引用元: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/ui/ContextMenu.html

たとえば、DataGrid コントロールが TabNavigator または VBox コンテナの子である場合、DataGrid コントロールは独自のコンテキスト メニューを持つことができません。

于 2011-03-16T08:46:25.277 に答える
0

Christopher Huylerも同様のものを投稿しました(ソース コードはこちらから入手できます)。記事から:

まず、 Google のコード リポジトリから Javascript コードを取得します。

ステップ 1 – カスタム コンテキスト メニュー コードのセットアップ

Flex Builder で新しい Flex プロジェクトを作成します。rightclick.js と swfobject.js をプロジェクトの html-template フォルダーにコピーします。ここから、いくつかの変更を加える必要がありました…</p>

  • オブジェクトとコンテナーの値を入力として受け入れるように、RightClick.init() 関数を変更しました。これにより、毎回同じものを呼び出す代わりに、アプリケーションの名前をオブジェクトとして渡すことができます。
  • index.template.html のヘッダーに rightclick.js と swfobject.js を含めました。
  • 「flashcontent」というボディに新しい div を追加しました。
  • body タグに onload ハンドラを追加して、RightClick を初期化しました
  • AC_FL_RunContent(…) を新しい SWFObject(…) に置き換えて、すべてのテンプレート変数を確実に維持します。

これらの変更を行った後、アプリケーションに右クリック コンテキスト メニューが表示されないことを確認しました。

ステップ 2 – rightClick イベントをリッスンする

次に、アプリケーションのメイン mxml ファイルに数行を追加して、アプリケーションを右クリックしたときにディスパッチされる ExternalInterface イベントをリッスンします。

private function handleCreationComplete():void
{
    ExternalInterface.addCallback("rightClick", handleRightClick);
}

private function handleRightClick():void
{
    Alert.show("Right Click Success!");
}

ステップ 3 – イベントを正しいオブジェクトにディスパッチする

イベントをメイン アプリケーションに渡すのは簡単ですが、実際には、右クリック イベントが発生したときに適切な子オブジェクトに通知する必要があります。アプリケーションでダブルクリック イベントを使用していないので、すべての右クリック イベントをダブルクリック イベントのように扱うことにしました。2 ボタン マウスを使用していないユーザー (別名 Mac ユーザー) はダブルクリックするだけで同じメニューを表示できますが、2 ボタン マウスを使用しているユーザーは右クリックするだけで済みます。イベントが適切なオブジェクトにディスパッチされるようにする方法を次に示します。

private function handleRightClick():void
{
    var objects:Array = systemManager.getObjectsUnderPoint(
        new Point(mouseX,mouseY));
    if (objects.length>0)
    {
        var object:Object = objects[objects.length-1];
        var relatedObject:InteractiveObject;
        if (object is InteractiveObject)
            relatedObject = object as InteractiveObject;
        else if (object.parent && object.parent is InteractiveObject)
            relatedObject = object.parent;
        var event:MouseEvent = new MouseEvent(
            MouseEvent.DOUBLE_CLICK,true,false,mouseX,mouseY,
            relatedObject);
        object.dispatchEvent(event);
    }
}

これが役立つことを願っています!

于 2011-03-09T16:12:55.613 に答える