我正在构建一个应用程序,在这个应用程序中,我希望用户能够在两个列中重新排序表单中的图片。我有一个设置宽度的flowLayoutPanel,图片是通过OpenFileDialog添加的,并缩放到流布局面板宽度的一半(减去滚动条的允许)。
这就是我卡住的地方-我试过添加图像作为标签,按钮,现在PictureBoxes,我无法找出如何实际移动它们。我放弃了标签,因为CanSelect
是假的——尽管我不知道这是否会产生影响——我从按钮转向了按钮,因为我意识到图片框的存在。我愿意切换出我使用的控件,但图像总是需要在两列中。
下面是我目前为DragEnter和DragDrop事件编写的代码:
private void flowLayoutPanel_6_Cards_DragEnter(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.All;
}
private void flowLayoutPanel_6_Cards_DragDrop(object sender, DragEventArgs e)
{
MessageBox.Show("dropped");
}
我如何实现这个?我应该使用哪些控件以及我应该查看哪些属性来实现这一点?
所以多亏了@TaW的评论,我现在知道你必须添加一个DoDragDrop调用MouseDown事件,无论你拖动什么。我现在的工作代码如下(主要感谢本教程):
private void flowLayoutPanel_6_Cards_DragDrop(object sender, DragEventArgs e)
{
PictureBox picture = (PictureBox)e.Data.GetData(typeof(PictureBox));
FlowLayoutPanel _source = (FlowLayoutPanel)picture.Parent;
FlowLayoutPanel _destination = (FlowLayoutPanel)sender;
if (_source != _destination)
{
//where did you even get this from?
}
else
{
Point p = _destination.PointToClient(new Point(e.X, e.Y));
var item = _destination.GetChildAtPoint(p);
int index = _destination.Controls.GetChildIndex(item, false);
_destination.Controls.SetChildIndex(picture, index);
_destination.Invalidate();
}
}
private void flowLayoutPanel_6_Cards_DragEnter(object sender, DragEventArgs e)
{
e.Effect = DragDropEffects.All;
}
void p_MouseDown(object sender, MouseEventArgs e)
{
PictureBox p = (PictureBox)sender;
p.DoDragDrop(p, DragDropEffects.All);
}