我想这样做,以便我的一些用户控件能够“弹出”到一个新窗口。我如何看待它的工作原理是用户控件将保留在当前它的位置,但会将其当前状态的副本发送到新窗口。我还希望此功能位于基类中,以便派生类具有此功能。
这是我到目前为止所做的:
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();
}
}
除了将用户控件从其所在的原始表单中删除之外 - 这是有效的 - 为了将其放在新表单上 - 我该如何解决?
答案 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();
}