Xamarin Forms Переключение двух элементов с помощью TranslateTo (x, y) вызывает проблемы во второй раз - PullRequest
0 голосов
/ 16 февраля 2020

Я создаю Пазл в формах Xamarin. Плитки размещаются в абсолютном макете один за другим. Каждая плитка имеет свойство ImageButton, которое размещается в определенных координатах x и y. Когда вы нажимаете на две плитки, они медленно меняются местами, используя imageButton.TranslateTo (x, y).

Это работает довольно хорошо, но только в первый раз.

enter image description here

enter image description here

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

Ничего не произойдет, если я попытаюсь переключить их снова. Как будто первый ImageButton думает, что второй имеет те же координаты, что и он сам, а второй думает, что он имеет те же координаты, что и первый, и поэтому переключение не выполняется.

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

enter image description here

Это мой 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, которые я объявил в классе. Они назначаются при нажатии.

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