2017-07-31 76 views
1

我一直看到有关添加事件的文章能够拖动面板。但是,我将如何通过动态创建的面板来实现这一点?能够拖动动态创建的面板

Panel pn = wch.GenerateWorkspaceControl(space.Name, space.Name, p); 
      PanelTest.Controls.Add(pn); 

     public Panel GenerateWorkspaceControl(string gbTitle, string gbName, Point gbPos) 
    { 
     Panel pnl = GeneratePanelContainer(gbPos, new Size(300, 200)); 
     pnl.Controls.Add(GenerateLabel(gbName,new Point(100,1),new Size(135,115))); 
     return pnl; 
    } 

private Panel GeneratePanelContainer(Point loc, Size size) 
    { 
     return new Panel() { BackColor = Color.Transparent, BorderStyle = BorderStyle.FixedSingle, Location = loc, Size = size }; 
    } 

是否在生成面板容器中添加事件处理程序?

总结我有一个面板是持有多个动态创建面板。我希望能够在主面板内的动作创建的面板上移动。

任何想法?

+0

是的,'pnl。 MouseMove + = pnl_MouseMove;'制作该方法,并将发件人对象转换为面板。 – LarsTech

+0

您可以为这些面板编写一个Coome事件集或Lambdas,或者创建一个MoveController类,并将其注册到该面板。 (我更喜欢后者。) – TaW

回答

0

这是一个让你可以移动的控件。

只需注册它:

MoveController.RegisterCtl(button1); 

现在,您可以移动控制..

完成后,你还可以注销控制:

MoveController.UnRegisterCtl(button1); 

这里是控制器类:

static class MoveController 
{ 
    static List<Control> Controls = new List<Control>(); 
    static Control curCtl = null; 
    static Point curStart = Point.Empty; 

    static public void RegisterCtl(Control ctl) 
    { 
     Controls.Add(ctl); 
     ctl.MouseDown += ctl_MouseDown; 
     ctl.MouseMove += ctl_MouseMove; 
     ctl.MouseUp += ctl_MouseUp; 
    } 

    static public void UnRegisterCtl(Control ctl) 
    { 
     if (Controls != null && Controls.Contains(ctl)) 
     { 
      Controls.Remove(ctl); 
      ctl.MouseDown -= ctl_MouseDown; 
      ctl.MouseMove -= ctl_MouseMove; 
      ctl.MouseUp -= ctl_MouseUp; 
     } 
    } 

    static void ctl_MouseDown(object sender, MouseEventArgs e) 
    { 
     curCtl = (Control)sender; 
     curStart = curCtl.Location; 
    } 

    static void ctl_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (curCtl != null) 
     { 
      curCtl.Left += e.Location.X - curCtl.Width/2; 
      curCtl.Top += e.Location.Y - curCtl.Height/2; 
     } 
    } 

    static void ctl_MouseUp(object sender, MouseEventArgs e) 
    { 
     curCtl = null; 
    } 
} 
+0

嘿谢谢,我通过做一些与你的帖子非常相似的东西来工作。从来没有在学校学过这个东西,所以这都是相当新的。此外,我不能发布,因为人们低估了我没有完全理解控制和事件? IDK的。但是,如果我能在这些评论中问你,我还有其他问题吗?有事件引发另一事件是不好的做法吗?就像组合框上的customindexchanged事件触发事件来更改标签。 – sublimeaces

+0

有时我发现自己在做这件事,但我通常会纠正它,并按照它应该写的代码。这是规则:控制事件不应包含任何冗长的代码。相反,他们应该调用一个可以完成工作的函数(名字很好)。 – TaW

+0

示例:SaveButton不应该进行保存。它应该调用saveData函数。 SaveDataMenuItem应该调用相同的函数,而不是saveButtonClick!当你想改变GUI并消除OkButton时,不需要代码chages。在更广泛的背景下,这是视图和模型的分离;所以:是的,这是不好的做法,但有时会滑入其中。 – TaW