C # - перетащить PictureBox на TableLayoutPanel - PullRequest
1 голос
/ 02 мая 2011

Я создаю игру, похожую на скрэббл, в C #, где у меня есть коллекция «букв» (элементы управления PictureBox), и мне нужно перетащить их на игровую доску (TableLayoutPanel, отображающая сетку элементов управления PictureBox).

Сначала я пытался использовать метод DoDragDrop () для буквы PictureBox в обработчике события MouseDown, но не смог заставить элемент управления что-либо делать, как только я начал перетаскивать. Я ссылался на этот код проекта .

После исчерпания этого я пытаюсь «вручную» переместить PictureBox с помощью обработчиков событий MouseDown, MouseMove и MouseUp:

private void letter1PictureBox_MouseDown(object sender, MouseEventArgs e)
    {
        if (sender is PictureBox && e.Button == MouseButtons.Left)
        {
            isDragging = true;
            dragOffsetX = e.X;
            dragOffsetY = e.Y;
        }
    }

private void letter1PictureBox_MouseMove(object sender, MouseEventArgs e)
    {
        if (isDragging)
        {
            PictureBox letter = (PictureBox)sender;

            letter.BringToFront();
            letter.Top += (e.Y - dragOffsetY);
            letter.Left += (e.X - dragOffsetX);
        }
    }

Моя проблема в том, что при попытке перетащить PictureBox на мою TableLayoutPanel (или где-либо за пределами GroupBox, в котором она содержится), PictureBox исчезает за панелью управления / панелью.

http://i.stack.imgur.com/uAJV9.png

Я бы подумал, что вызов BringToFront () мог бы предотвратить это, нет?

Помощь очень ценится.

Ответы [ 2 ]

0 голосов
/ 02 мая 2011

Кто является родителем плитки (PictureBox)? Это TableLayoutPanel или это форма?

Возможно, вам понадобится сделать TableLayoutPanel родителем PictureBox. Я не думаю, что этот тип Panel "любит" объекты перед ним.

Кроме того, не проще / лучше ли поставить плитку в нужное положение?

int posX=(posX/tileSize)*tileSize;
int posY=(posY/tileSize)*tileSize;

Это целочисленное деление / умножение должно привязывать его к сетке, но применять его только после того, как плитка будет выпущена пользователем. Чтобы узнать, в какой ячейке находится мозаика, не умножайте на tileSize в конце:

int cellX=(posX/tileSize);
int cellY=(posY/tileSize);
0 голосов
/ 02 мая 2011

Помогает ли отправить TableLayoutPanel обратно в окно дизайна? Я думаю, вы, наверное, уже пробовали это

...