Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在单个窗体中的多个容器之间移动控件_C#_Winforms - Fatal编程技术网

C# 在单个窗体中的多个容器之间移动控件

C# 在单个窗体中的多个容器之间移动控件,c#,winforms,C#,Winforms,这些问题说明了一切 如何移动控件,例如在多个面板之间移动PictureBox,或者在面板和flow布局面板之间移动PictureBox 我知道我可以在多个面板之间拖放控件,但是这并不能使控件在容器之间可视地移动。鼠标仅更改为不同的光标,拖动到另一个控件并释放鼠标按钮后,该控件将显示在另一个容器上。我要求控件在视觉上是可移动的 有人能提供一个简单的例子,这样我就可以提取出适用于我的情况的想法 注意:当然是运行时。假设您需要它运行时: 您可以使用control.SaveToBitmap方法将控件另

这些问题说明了一切

如何移动控件,例如在多个面板之间移动PictureBox,或者在面板和flow布局面板之间移动PictureBox

我知道我可以在多个面板之间拖放控件,但是这并不能使控件在容器之间可视地移动。鼠标仅更改为不同的光标,拖动到另一个控件并释放鼠标按钮后,该控件将显示在另一个容器上。我要求控件在视觉上是可移动的

有人能提供一个简单的例子,这样我就可以提取出适用于我的情况的想法


注意:当然是运行时。

假设您需要它运行时:

  • 您可以使用
    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欢迎,我很高兴它帮助了你。但是一些愚蠢的人没有任何正当的理由就投了反对票:(是的,我有点