2012-03-25 3 views
0

У меня проблема с MouseDragElementBehvior в WPF. Я реализую игривую игру с плитками, которую я хочу перетащить из стойки на доску (оба из которых являются элементами Canvas). Плитки, очевидно, различны каждый раз и поэтому генерируются в коде позади.MouseDragElementBehavior Оставляя дублирующий элемент за

Мне удалось заставить поведение Drag работать, и я могу перетаскивать изображения из плиточной стойки (холста) на другой холст. Проблема возникает, когда я разместил ее на доске и хочу снова ее переместить. Он работает сначала несколько раз, а затем иногда, когда вы перетаскиваете элемент, который уже находится на доске, он оставляет дубликат элемента позади и затем выбрасывает исключение нулевой ссылки.

Способ, которым я реализовал это, имея глобальную переменную изображения, которая отслеживает, какое изображение в настоящее время перетаскивается, если оно есть, и в основном на событие MouseDown, я меняю выбранный фрагмент на тот, который имеет просто нажата.

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

Тогда событие, которое увольняют для отделки Drag:

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, который показал мне разные слои, а затем мне удалось выяснить, что делает мой код.

Смежные вопросы