C# - 将PictureBox拖放到TableLayoutPanel上

时间:2011-05-01 23:12:14

标签: c# winforms drag-and-drop picturebox

我正在C#中构建类似拼字游戏的游戏,其中我有一组“字母”(PictureBox控件),需要将它们拖放到游戏板上(TableLayoutPanel显示PictureBox控件的网格)。 / p>

我最初尝试在MouseDown事件处理程序内的字母PictureBox上使用DoDragDrop()方法,但是一旦开始拖动就无法使控件执行任何操作。我引用了这个code project

在筋疲力尽之后,我试图使用MouseDown,MouseMove和MouseUp事件处理程序“手动”移动PictureBox:

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 :(得分:0)

将TableLayoutPanel发送回设计窗口是否有帮助?我想你可能已经尝试过了..

答案 1 :(得分:0)

谁是瓷砖的父母(PictureBox)?是TableLayoutPanel,还是Form?

您可能需要将TableLayoutPanel作为PictureBox的父级。我不认为这种类型的面板“喜欢”它前面的物体。

另外,自己将瓷砖卡到位置是不是更容易/更好?

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

整数除法/乘法应将其捕捉到网格中,但只有在用户释放磁贴后才应用它。要知道磁贴所在的单元格,请不要在末尾乘以tileSize:

int cellX=(posX/tileSize);
int cellY=(posY/tileSize);