2017-07-31 54 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