У меня проблема с 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();
}
}
Может кто-нибудь помочь мне, почему это может происходить, что элемент получает тащили, но оставляет копию позади, а затем выбрасывает исключение нулевой ссылки? Или, может быть, предложите лучший, более надежный способ достижения этого.