将用户控件弹出到新窗口中

时间:2012-08-02 12:01:06

标签: c# user-interface popup

我想这样做,以便我的一些用户控件能够“弹出”到一个新窗口。我如何看待它的工作原理是用户控件将保留在当前它的位置,但会将其当前状态的副本发送到新窗口。我还希望此功能位于基类中,以便派生类具有此功能。

这是我到目前为止所做的:

public class PopoutControl : XtraUserControl
{
    public void Popout()
    {
        XtraForm PopoutForm = new XtraForm();
        PopoutForm.Controls.Add(this);
        Dock = DockStyle.Fill;
        PopoutForm.Show();
    }
}


public partial class PopoutControlTest : PopoutControl
{
    public PopoutControlTest()
    {
        InitializeComponent();
    }

    private void OnPopoutRequest(object sender, EventArgs e)
    {
        Popout();
    }
}

除了将用户控件从其所在的原始表单中删除之外 - 这是有效的 - 为了将其放在新表单上 - 我该如何解决?

  • 威廉

2 个答案:

答案 0 :(得分:3)

您应该制作控件的副本,而不是传递引用,例如,通过实现一些“克隆”方法:

public class PopoutControl : XtraUserControl
{
    public void Popout()
    {
        XtraForm PopoutForm = new XtraForm();
        PopoutForm.Controls.Add(this.Clone());
        Dock = DockStyle.Fill;
        PopoutForm.Show();
    }

    public PopoutControl Clone()
    { 
       var p = new PopoutControl();

       // implement copying of the current state to p here
       // ...

       return p;
    }

}

编辑:有关克隆或序列化Windows窗体控件的一般方法,请阅读以下文章:

http://www.codeproject.com/Articles/12976/How-to-Clone-Serialize-Copy-Paste-a-Windows-Forms

答案 1 :(得分:1)

你的PopOut()必须改变。创建'this'的克隆。将克隆的对象添加到创建的新表单中。在PopOutControl类中实现ICloneable接口。必须实现clone()方法,使其具有与'PopOutControl'对象相同的状态,即'this'。

public void Popout()
    {
        XtraForm PopoutForm = new XtraForm();
        PopoutForm.Controls.Add(this.Clone());
        Dock = DockStyle.Fill;
        PopoutForm.Show();
    }