Domanda

Ecco il mio problema:

Ho una 'lavagna' di tela principale in un pannello, questa tela ha molti bambini, come una barra degli strumenti (tessere), un'etichetta e alcuni skinning.

Il problema è che quando passo allo strumento rettangolo e comincio a disegnare rettangoli se voglio cambiare lo strumento quando faccio clic su un altro strumento come "cerchio" o "seleziona" il pulsante non cattura il clic evento, invece la tela catturerà il mouse e inizierà a disegnare.

Proprio come nella foto, quindi non riesco a cambiare strumento una volta che inizio a disegnare.

alt text http://www.freeimagehosting.net/uploads/397a7cd49e.png

Come potrei non far reagire la tela quando è su uno strumento, o come posso fare in modo che il pulsante catturi prima il clic e dica alla tela di non disegnare nulla.

Naturalmente potrei semplicemente posizionare la barra degli strumenti da qualche altra parte non sulla tela, ma poiché lo spazio è importante vorrei che i pulsanti fossero sulla tela.

Sono aperto a qualsiasi suggerimento.

=== Ecco alcuni codici per mostrare come funziona internamente. ===

<?xml version="1.0" encoding="utf-8"?>
<mx:Panel xmlns:mx="http://www.adobe.com/2006/mxml" 
          xmlns:degrafa="http://www.degrafa.com/2007"
          xmlns:comp="org.foo.bar.view.components.*"
          layout="absolute"
          title="Tableau">


    <mx:Script>
    <![CDATA[
        import org.edorado.edoboard.ApplicationFacade;
    ]]>
    </mx:Script>

    <mx:Canvas id="blackBoard">

        <degrafa:Surface id="boardSurfaceContainer">
             skinning      
     </degrafa:Surface>

        <!-- Tool bar -->
        <comp:ToolbarView 
           id = "toolbar"
           name = "toolbar"
           verticalScrollPolicy="off" 
           horizontalScrollPolicy="off"
           bottom="5"
           right="5"
           top="5"
           direction="vertical"
           width="30" />   

        <mx:Label x="10" y="10" text="Label"  color="#FFFFFF" id="lbl"/>

    </mx:Canvas>

</mx:Panel>

La barra degli strumenti è un elenco di pulsanti contenuti in un riquadro. La "lavagna" della tela è collegata alla gestione di numerosi eventi, in particolare il mouse verso l'alto e lo spostamento per disegnare le forme.

...
boardCanvas.addEventListener(MouseEvent.MOUSE_DOWN, handleMouseDown);
            boardCanvas.addEventListener(MouseEvent.MOUSE_UP, handleMouseUp);
...
        private function handleMouseDown(event:MouseEvent):void {
            // Get the current mouse location wich may be adjusted to the grid
            var selectPoint:Point = boardCanvas.globalToLocal(new Point(event.stageX, event.stageY));
            startPoint = snapPoint(selectPoint.x, selectPoint.y);
            boardView.lbl.text = '(' + startPoint.x +',' + startPoint.y + ')';
....

La barra degli strumenti ascolta anche i clic

<?xml version="1.0" encoding="utf-8"?>
<mx:Tile xmlns:mx="http://www.adobe.com/2006/mxml">

    <mx:Script>
        <![CDATA[
            import mx.charts.BubbleChart;
            import org.edorado.edoboard.view.components.shapes.*; 

            public static const TOOL_CHANGE:String  = "toolChange";
            public static const TEXT_TOOL:String  = "textTool";
            public static const SELECT_TOOL:String  = "selectTool";
            public static const RECTANGLE_TOOL:String  = "rectangleTool";

            private var b:Button = null;

            private function handleButtonClick(event:MouseEvent):void {
                trace("CLICKED  TOOL");
                // selectButton.dispatchEvent(new Event(TOOL_CHANGE, true, true)) 
                b = event.target as Button;
                b.dispatchEvent(new Event(TOOL_CHANGE, true, true));
            }


        ]]>
    </mx:Script>

          <!-- Use class facotry ? -->
          <mx:Button id="selectButton"
                     name="{SELECT_TOOL}"
                     selectedUpSkin="assets.skins.ToolButtonSkin"
                     width="30" 
                     height="30" 
                     styleName="selectButton" 
                     toolTip="selection" 
                     click="handleButtonClick(event); " />

          <mx:Button id="textButton"
                     name = "{TEXT_TOOL}"
                     selectedUpSkin="assets.skins.ToolButtonSkin"
                     width="30" 
                     height="30" 
                     styleName="textButton"  
                     toolTip="text"
                     click="handleButtonClick(event);" />

          <mx:Button id="rectButton" 
                     name = "{RECTANGLE_TOOL}"
                     selectedUpSkin="assets.skins.ToolButtonSkin"
                     width="30"
                     height="30"
                     styleName="rectButton"
                     toolTip="rectButton"
                     click="handleButtonClick(event);" />
</mx:Tile>
È stato utile?

Soluzione 2

Grazie, Ho trovato alcuni post simili in realtà ho appena ascoltato il mouse in basso nella mia barra degli strumenti e ho fermato la propagazione degli eventi in modo che la tela non la catturasse.

Altri suggerimenti

Puoi utilizzare il target proprietà del tuo MouseEvent per differenziare il comportamento quando il il clic proviene dalla barra degli strumenti. Basta prendere un bottino su LiveDocs per capire qual è la proprietà target.

Buona fortuna!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top