模仿用户控件

时间:2012-12-14 16:49:17

标签: wpf user-controls popup

我有一个带有文本框和复选框的wpf用户控件。 usercontrol使用元素主机在winforms Tab控件中显示。我希望用户控件通过单击用户控件上的按钮弹出一个全新的winform。

我尝试了一个示例项目,我可以通过

来完成
void button1_Click(object sender, EventArgs e)
{
    Form frm = new Form();
    UserControl uc = userControl11;
    frm.Controls.Add(uc);
    frm.Show();
}

但是,我想要一种方法,以便用户可以单击按钮将用户控件弹出到新表单,然后单击相同按钮关闭新弹出窗体并在标签页中显示控件。显然,所有用户输入的数据仍应存在。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

MVVM是你的朋友。将UserControl的所有逻辑(用户数据,弹出状态等)集中在ViewModel对象中,并将其设置为控件的DataContext。要“弹出”控件,只需创建一个新控件并将其DataContext设置为第一个的ViewModel。您可以在ViewModel中拥有一个属性,以了解控件是否弹出,相应地执行操作并在按下弹出按钮时切换它。

答案 1 :(得分:0)

创建userControl后,它就会被创建,你可以将它分配给另一个ElementHost(我的例子中,两个表单都有元素控件)。看看这是否符合您的要求。

<强> Form1中

public partial class Form1 : Form
{
    Form2 frm2;
    bool popout = false;
    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (popout)
        {
            frm2.Close();
        }
        else
        {
            frm2 = new Form2();
            frm2.FormClosed += new FormClosedEventHandler(frm2_FormClosed);
            this.elementHost1.Child = null;
            frm2.setUserControl(userControl11);
            frm2.Show();
            popout = true;
        }
    }

    void frm2_FormClosed(object sender, FormClosedEventArgs e)
    {
        frm2.setUserControl(null);
        this.elementHost1.Child = userControl11;
        frm2.FormClosed -= new FormClosedEventHandler(frm2_FormClosed);
        popout = false;
    } 
}

<强>窗体2

public partial class Form2 : Form
{
    public Form2()
    {
        InitializeComponent();
    }
    public void setUserControl( System.Windows.Controls.UserControl item)
    {
        elementHost1.Child = item ;
    }
}