如何使图像可拖放以重新排序



我正在构建一个应用程序,在这个应用程序中,我希望用户能够在两个列中重新排序表单中的图片。我有一个设置宽度的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);
}

相关内容

  • 没有找到相关文章

最新更新