2012-03-25 23 views
0

我在WPF中的MouseDragElementBehvior存在一些问题。我正在执行一个拼图游戏,其中包含要从机架拖放到电路板上的拼贴游戏(都是Canvas元素)。这些瓷砖每次都有明显的不同,因此会在后面的代码中生成。MouseDragElementBehavior将重复的项目留在后面

我设法让拖动行为工作,我可以将图像从瓷砖机架(画布)拖到另一个画布。当我将其中一个放在板上并希望再次移动时,问题就出现了。它在最初几次运行,然后有时候,当你拖动已经在板上的物品时,它会留下物品的重复,然后抛出一个空引用异常。

我已经实现它的方式是通过一个全局图像变量来跟踪当前正在拖动哪个图像(如果有的话),并且基本上在MouseDown事件中,我将当前选择的图块更改为具有该图块的图块刚被按下。

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

然后就是获取拖动完成触发事件:

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(); 
      } 

     } 

谁能帮我,为什么这可能会发生,该元素被拖累,但保留一个副本背后,然后抛出一个空引用异常?或者,也许建议一个更好,更可靠的方法来实现这一点。

回答

0

如果有人想知道我是如何解决这个问题的,那么在我再次绘制它之前,我已经忘记了基本清理画布。所有需要的是在再次绘制它们之前移除所有的子元素。

我使用了一个名为Snoop的工具,它向我展示了不同的图层,然后我设法弄清楚我的代码在做什么。