2012-03-25 20 views
0

Ich habe ein kleines Problem mit dem MouseDragElementBehvior in WPF. Ich implementiere ein Scrabble-Spiel mit Kacheln, die ich aus einem Rack auf das Board ziehen möchte (beides Canvas-Elemente). Die Kacheln sind offensichtlich jedes Mal anders und werden daher im Code dahinter generiert.MouseDragElementBehavior Doppeltes Element hinter

Ich habe es geschafft, dass das Drag-Verhalten funktioniert und ich Bilder aus dem Kachel-Rack (Canvas) in ein anderes Canvas ziehen kann. Das Problem tritt auf, wenn ich eins auf das Brett gelegt habe und es wieder verschieben möchte. Es funktioniert die ersten Male und manchmal, wenn Sie ein Objekt ziehen, das sich bereits auf dem Board befindet, hinterlässt es ein Duplikat des Elements und dann löst eine Null-Referenzausnahme aus.

Die Art, wie ich es implementiert habe, indem ich eine globale Bildvariable habe, die verfolgt, welches Bild gerade gezogen wird, wenn es eines gibt, und im Grunde das MouseDown-Ereignis, wechsle ich die aktuell ausgewählte Kachel zu der, die hat gerade gedrückt worden.

MouseDragElementBehavior dragBe = new MouseDragElementBehavior(); 
dragBe.Attach(imageIcon); 
dragBe.DragFinished += onDragFinishedFromBoard;      
imageIcon.MouseDown += (sender, args) => 
{ 
if (currentTileSelected ==null) 
{ 
     currentTileSelected = sender as Image;        
} }; 

Dann wird das Ereignis, das für den Drag-Finish gefeuert wird:

private void onDragFinishedFromBoard(object sender, MouseEventArgs args) 
{ 
if (currentTileSelected != null) 
     { 
      s = (Square) currentTileSelected.Tag; 
      letter = (Tile)s.Letter; 

      double X = args.GetPosition(canvasBoard).X; 
      double y = args.GetPosition(canvasBoard).Y; 
      int row, col; 
      if (X > 0 && y > 0) 
      { 

       row = (int)Math.Floor(y/35); 
       col = (int)Math.Floor(X/35); 
       if (theCurrentGame.TheBoard.ScrabbleBoard[col][row].ContainsLetter==true) 
       { 
        // 
        currentTileSelected.Source = null; 
        currentTileSelected.Visibility = Visibility.Collapsed; 
        currentTileSelected = null; 
        redrawTileRack(); 


       } 
       else 
       { 
        Debug.WriteLine("row: " + row + " col:" + col); 
        //remove it from old position 
        if (s!=null) 
        { 
         s.ContainsLetter = false; 
         s.Letter = null; 
         s.partOfCurrentTurn = false; 
         theCurrentGame.TheBoard.ScrabbleBoard[s.Coordinate.Key][s.Coordinate.Value] = s; 

        } 
        //snap it into board new position 
        Square currentSquare = theCurrentGame.TheBoard.ScrabbleBoard[col][row]; 
        currentSquare.ContainsLetter = true; 
        currentSquare.Letter = letter; 
        currentSquare.partOfCurrentTurn = true; 
        theCurrentGame.TheBoard.ScrabbleBoard[col][row] = currentSquare; 
        drawBoard(theCurrentGame.TheBoard); 
        //remove tile from display 
        theCurrentGame.Human.TileRack.Tiles.Remove(letter); 
        currentTileSelected.Source = null; 
        currentTileSelected.Visibility = Visibility.Collapsed; 
        currentTileSelected = null; 
       } 
      } 
      else 
      { 
       currentTileSelected.Source = null; 
       currentTileSelected.Visibility = Visibility.Collapsed; 
       currentTileSelected= null; 
       redrawTileRack(); 
      } 

     } 

Könnte mir jemand helfen, warum dies kann passieren, dass das Element gezogen wird, läßt aber eine Kopie hinter und dann Gibt eine Nullreferenzausnahme zurück? Oder schlagen Sie vielleicht einen besseren, zuverlässigeren Weg vor, dies zu erreichen.

Antwort

0

Wenn jemand sich fragt, wie ich das behoben habe, habe ich vergessen, meine Leinwand im Grunde zu löschen, bevor ich erneut darauf zeichne. Sie mussten nur alle untergeordneten Elemente entfernen, bevor Sie sie erneut zeichneten.

Ich benutzte ein Werkzeug namens Snoop, das mir die verschiedenen Schichten zeigte und dann gelang es mir herauszufinden, was mein Code tat.