MouseDragElementBehavior Оставляя дубликаты позади - PullRequest
0 голосов
/ 25 марта 2012

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

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

Способ, который я реализовалИменно благодаря наличию глобальной переменной изображения, которая отслеживает, какое изображение в данный момент перетаскивается, если оно есть, и, в основном, по событию 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();
            }

        }

Может ли кто-нибудь помочь мне понять, почему это происходит, что элемент перетаскивается, но оставляет копию и затем выбрасываетисключение нулевой ссылки?Или, возможно, предложить лучший, более надежный способ достижения этого.

1 Ответ

0 голосов
/ 03 сентября 2012

Если кому-то интересно, как я это исправил, я забыл очистить свой холст, прежде чем снова рисовать на нем.Все, что было нужно, это удалить все дочерние элементы перед тем, как рисовать их снова.

Я использовал инструмент под названием Snoop , который показал мне различные слои, а затем мне удалось выяснить, что мойкод делал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...