4

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

这是我到目前为止所拥有的:

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();
    }
}

这有效,除了它从它所在的原始表单中删除用户控件 - 为了将其放置在新表单上 - 我该如何解决这个问题?

  • 威廉
4

2 回答 2

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

于 2012-08-02T12:13:44.007 回答
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();
    }
于 2012-08-02T12:14:58.293 回答