【问题标题】:How to void overlap of 2 images when drag and drop in C#?在 C# 中拖放时如何避免 2 个图像的重叠?
【发布时间】:2011-01-20 11:04:29
【问题描述】:

我想在面板中拖放图像,并希望避免图像重叠。图像是从另一个面板拖动的,我想从这些图像构建布局。我能够将图像拖放到面板上,并希望在拖放时避免重叠。

private void panel1_DragDrop(object sender, DragEventArgs e) { // this.Cursor = Cursors.SizeAll;

        Control c = e.Data.GetData(e.Data.GetFormats()[0]) as Control;
        if (c != null)
        {
            mycontrol = c;


              c.Location = this.panel1.PointToClient((new Point(e.X, e.Y)));

                this.panel1.Controls.Add(c);

        }  

    }

e.X 和 e.Y 不得位于面板中的其他控件之上。

我该怎么做?请给我一个合适的解决方案。

谢谢。

【问题讨论】:

  • @C. Karunarathne - Stackoverflow 用户希望人们至少做一些工作并展示它。如果您不提供一些代码并解释什么不起作用,那么没有人会响应代码请求。
  • @C. Karunarathne,即使您不知道如何开始编码,您也可以提供更多信息。例如。在哪里放置图像?来自文件还是来自 Winform 中的另一个 Image 控件?您的具体要求是什么?例如。如果拖动的图像大于目标面板,预期的行为是什么。

标签: c# .net-3.5


【解决方案1】:

您的问题有两种解释:

1) 您希望您放置的控件对其进行 Zorder 调整,以便它在您面板中的其余控件“之后”...大概您希望放置的图像成为背景?

如果是这样,那么就这样做:

c.SendToBack();

在你完成 this.panel1.Controls.Add(c);

2) 您实际上是在将几张图像放入面板中,并且您希望它们像垂直排列在一个列表中一样排列。

如果你想要这样,那么你需要定位放置的图像,以便指定它的顶部和左侧坐标,以便它们从面板中出现的“最底部”图像控件开始。

您可以通过几种不同的方式计算坐标,具体取决于您在 .Control 集合中维护控件的方式。

如果出现在 Controls 集合中的控件按照其垂直 Y 偏移量的顺序正确排序/维护,那么您可以简单地查看 .Controls 集合中的最后一个控件,找到它的底部 y 位置:

例如

如果 (this.panel1.Controls.Count == 0)
{
c.X = 0;
c.Y = 0;
}
其他
{
c.X = 0;
c.Y = this.panel1.Controls[this.panel1.Controls.Count - 1].Bottom;
}

如果您不按像素 y 顺序维护图像控件,那么您将不得不遍历 .Controls 集合中的所有控件并找到具有最大“底部”的控件,并将其用作开始新放置的图像控件的点。

【讨论】:

    猜你喜欢
    • 2023-04-06
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 2015-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多