C# 在单个窗体中的多个容器之间移动控件
这些问题说明了一切 如何移动控件,例如在多个面板之间移动PictureBox,或者在面板和flow布局面板之间移动PictureBox 我知道我可以在多个面板之间拖放控件,但是这并不能使控件在容器之间可视地移动。鼠标仅更改为不同的光标,拖动到另一个控件并释放鼠标按钮后,该控件将显示在另一个容器上。我要求控件在视觉上是可移动的 有人能提供一个简单的例子,这样我就可以提取出适用于我的情况的想法C# 在单个窗体中的多个容器之间移动控件,c#,winforms,C#,Winforms,这些问题说明了一切 如何移动控件,例如在多个面板之间移动PictureBox,或者在面板和flow布局面板之间移动PictureBox 我知道我可以在多个面板之间拖放控件,但是这并不能使控件在容器之间可视地移动。鼠标仅更改为不同的光标,拖动到另一个控件并释放鼠标按钮后,该控件将显示在另一个容器上。我要求控件在视觉上是可移动的 有人能提供一个简单的例子,这样我就可以提取出适用于我的情况的想法 注意:当然是运行时。假设您需要它运行时: 您可以使用control.SaveToBitmap方法将控件另
注意:当然是运行时。假设您需要它运行时:
- 您可以使用
方法将控件另存为位图control.SaveToBitmap
- 创造
- 设置我们从控件创建的当前光标
- 拖放完成后,重置光标
- 您可以使用
方法将控件另存为位图control.SaveToBitmap
- 创造
- 设置我们从控件创建的当前光标
- 拖放完成后,重置光标
- 让我们举一个简单的例子,拖动按钮
假设您有两种类型的容器控件:
1) X-Y布局
2) 流程布局(假设从左到右)
单击拖动按钮时,记录从单击到控件左上角的x偏移和y偏移。同时,在Controls集合中记录控件的索引
当鼠标移动时,首先检查鼠标是否更改了容器控件。
如果是,则从当前父级中删除按钮并将其添加到新父级
如果按钮添加到流控件,则需要计算新索引。为此,请计算鼠标到所有其他控件的边界框最近边的距离。然后,如果鼠标位于该控件中心的左侧,则插入该控件的索引-1,否则插入该控件的右侧(索引+1)
如果按钮被添加到X-Y布局中,那么索引就没有那么重要了。您可以简单地设置按钮相对于鼠标的位置加上x偏移和y偏移
当鼠标拖动时,需要强制刷新控件。我认为对容器控件调用Invalidate()就足够了
这将为您提供开始编写代码的基本思路。让我们举一个简单的例子,拖动一个按钮 假设您有两种类型的容器控件: 1) X-Y布局 2) 流程布局(假设从左到右) 单击拖动按钮时,记录从单击到控件左上角的x偏移和y偏移。同时,在Controls集合中记录控件的索引 当鼠标移动时,首先检查鼠标是否更改了容器控件。 如果是,则从当前父级中删除按钮并将其添加到新父级 如果按钮添加到流控件,则需要计算新索引。为此,请计算鼠标到所有其他控件的边界框最近边的距离。然后,如果鼠标位于该控件中心的左侧,则插入该控件的索引-1,否则插入该控件的右侧(索引+1) 如果按钮被添加到X-Y布局中,那么索引就没有那么重要了。您可以简单地设置按钮相对于鼠标的位置加上x偏移和y偏移 当鼠标拖动时,需要强制刷新控件。我认为对容器控件调用Invalidate()就足够了
这应该给你一个开始编写代码的基本想法。你想在设计时还是运行时完成这项工作?@JamesCurran run time当然。你想在设计时还是运行时完成这项工作?@JamesCurran run time当然。我没有投反对票,但你似乎没有抓住重点。如果我理解正确,OP希望能够在运行时以与在设计器中移动控件相同的方式移动控件。@SriramSakthivel这是一种有趣的方法。当控件开始移动时,光标将获取控件的“图像”,控件本身将不可见。然后在放下控件后,我会将控件从一个容器切换到另一个容器,并重置光标。很有趣。我明天试试。谢谢。@BartoszKP我错过了我的答案缺少的东西?这与设计师的工作方式几乎相同。如果需要,可以在拖动开始时隐藏控件,并在拖放后使其可见finished@SriramSakthivel嗨,我试过你的主意了。你没有遗漏任何东西,这正是我所需要的。谢谢。@FábioAntunes欢迎,我很高兴它帮助了你。一些愚蠢的人在没有任何正当理由的情况下否决了投票:(我没有投反对票,但你似乎没有抓住要点。如果我理解正确,OP希望能够在运行时以与在设计器中移动控件相同的方式移动控件。@SriramSakthivel这是一种有趣的方法。当控件开始移动时,光标将移向“图像”控件的属性,控件本身将变得不可见。在删除控件后,我会将控件从一个容器切换到另一个容器,并重置光标。非常有趣。我明天会尝试。谢谢。@BartoszKP我缺少我的答案所缺少的内容?这与设计器的工作方式几乎相同。如果需要,可以隐藏控件l拖动时启动并使其在拖放时可见finished@SriramSakthivel嗨,我尝试过你的想法。你没有遗漏任何东西,这正是我所需要的。我的感谢。@Fábioantune欢迎,我很高兴它帮助了你。但是一些愚蠢的人没有任何正当的理由就投了反对票:(是的,我有点