【问题标题】:Popout a user control into a new window将用户控件弹出到新窗口中
【发布时间】:2012-08-03 01:34:36
【问题描述】:

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

这是我目前所拥有的:

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

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

  • 威廉

【问题讨论】:

    标签: c# user-interface popup


    【解决方案1】:

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

    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

    【讨论】:

    • 有什么方法可以为克隆用户控件制作标准扩展?
    • @William:简短回答 - 不。长答案:由于您的用户控件可以是或至少包含任意类型的对象,因此为用户控件编写通用克隆方法的任务与为任意对象创建通用克隆方法没有什么不同——这通常也是不可能的.然而,在某些情况下,通用解决方案是可能的。阅读此csharp411.com/c-object-clone-wars 了解有关克隆对象的更多信息。
    • 我已经看到了,我喜欢使用 serializaiton 进行深度克隆的方法 (codeproject.com/Articles/23832/…) - 但这对于用户控件来说是一个好的解决方案吗?序列化和反序列化用户界面组件有什么问题吗?
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-21
      相关资源
      最近更新 更多