在外部启动 C# WinForm(在面板中打开)

本文关键字:外部 启动 WinForm | 更新日期: 2023-09-27 18:35:34

我以前从未遇到过这种情况,所以我不确定我是否可以在 C# 中做到这一点。

我有一个在应用程序的面板中打开的 WinForm。以下是我用来打开应用程序内每个表单的代码:

public static void OpenForm(System.Windows.Forms.Form formName, bool showAsModal, bool launchInPanel, ref Panel panel)
{
    bool isAlreadyOpen = false;
    foreach (Form form in Application.OpenForms)
    {
        if (form.Text == formName.Text)
        {
            isAlreadyOpen = true;
            form.WindowState = FormWindowState.Normal;
            form.Focus();
            break;
        }
    }
    if (isAlreadyOpen == false)
    {
        if (!showAsModal)
        {
            if (launchInPanel)
            {
                formName.TopLevel = false;
                formName.AutoScroll = true;
                panel.Controls.Add(formName);
            }
        }
        if (!showAsModal)
            formName.Show();
        else
            formName.ShowDialog();
    }
}

我想做的是在任何给定的表单上放置一个按钮,当用户单击该按钮时,该按钮将作为普通的 WinForm 重新启动该窗口(即不在面板内)。我知道我可以编写代码来关闭并重新打开表单,而无需将其添加到面板,但我认为这会导致用户丢失他们在该表单中输入的任何信息或选择。

思潮?

在外部启动 C# WinForm(在面板中打开)

这可以通过以下方式(动态)将Button添加到Form中来实现。

var button = new Button {Text = "Show Out"};
button.Click += (o, args) =>
{
    formName.Visible = false;
    if (panel1.Controls.Contains(formName)) // show outside of the parent window
    {
        panel1.Controls.Remove(formName);
        formName.TopLevel = true;
        button.Text = Text = "Show In";     
    }
    else //flip - bring it inside the panel.
    {
        formName.TopLevel = false;
        panel1.Controls.Add(formName);
        button.Text = Text = "Show Out";        
    }
    formName.Show();
};
formName.Controls.Add(button);

没有足够的信息来评论设计,但我建议考虑@Thakur在评论中解释的建议,可能这就是你想要的。