Я создаю Пазл в формах Xamarin. Плитки размещаются в абсолютном макете один за другим. Каждая плитка имеет свойство ImageButton, которое размещается в определенных координатах x и y. Когда вы нажимаете на две плитки, они медленно меняются местами, используя imageButton.TranslateTo (x, y).
Это работает довольно хорошо, но только в первый раз.
Во второй раз я пытаюсь переключить некоторые из тех же кнопок изображения, которые щелкнули ранее, их местоположение полностью испорчено.
Ничего не произойдет, если я попытаюсь переключить их снова. Как будто первый ImageButton думает, что второй имеет те же координаты, что и он сам, а второй думает, что он имеет те же координаты, что и первый, и поэтому переключение не выполняется.
Однако, если я нажму на одну из них, а затем на другую плитку, которая не использовалась до того, как что-то пойдет не так. На этот раз я пробовал несколько раз, но, как вы можете видеть, он не переключает их по фактическому расположению.
Это мой XAML:
XAML
<AbsoluteLayout x:Name="boardView" >
</AbsoluteLayout>
Код позади
Кнопки ImageButton добавляются во вложенные элементы для l oop по одному, например:
ImageButton imageBtn = new ImageButton()
{
WidthRequest = sizePerTile,
HeightRequest = sizePerTile,
BackgroundColor = randomColor,
CornerRadius = 0
};
boardView.Children.Add(imageBtn);
AbsoluteLayout.SetLayoutBounds(tempTile.PartialImageButton,new Rectangle(new Point(xPoint, yPoint), new Size(sizePerTile,sizePerTile)));
(но эта часть не так важна) для проблемы переключения)
Метод обмена
public void Swap(TwoDimArrayPosition indexOfFirstTile, TwoDimArrayPosition indexOfSecondTile)
{
// LOGIC RE-POSITIONING
// Second selected tile to be swapped with the first one
Tiles[indexOfSecondTile.RowIndex, indexOfSecondTile.ColumnIndex] = firstTile;
// First selected tile to be swapped with the second one
Tiles[indexOfFirstTile.RowIndex, indexOfFirstTile.ColumnIndex] = secondTile;
// Translation (First tile)
firstTile.PartialImageButton.TranslateTo(-firstTile.PartialImageButton.X + secondTile.PartialImageButton.X, -firstTile.PartialImageButton.Y + secondTile.PartialImageButton.Y);
// Translation (Second tile)
secondTile.PartialImageButton.TranslateTo(-secondTile.PartialImageButton.X + firstTile.PartialImageButton.X, -secondTile.PartialImageButton.Y + firstTile.PartialImageButton.Y);
}
Как уже упоминалось, это работает в первый раз, но в следующий раз, когда я пытаюсь переключить один из кнопки, которые были переключены, прежде чем он испортится.
firstTile и secondTile - это переменные экземпляра Tile, которые я объявил в классе. Они назначаются при нажатии.