首页 > 解决方案 > 如何使用反射在容器内动态创建表单?

问题描述

我正在尝试创建一个能够创建给定表单的一个实例的通用库。我正在使用 WeifenLuo 库。

在主窗体中,有一个停靠容器。如果我直接在方法中创建一个实例,它就起作用了。但是,当我调用我的通用方法时,它会在容器外显示新的表单。

private void button1_Click(object sender, EventArgs e)
        {
            // This works and put the new form inside the container
            Form1 form = new Form1();
            form.Show(mainFormDockPanel);
            // This just create the new form and open it outside the container
            //Forms.OpenForm<Form1>(this.mainFormDockPanel);
            Debug.WriteLine("Content: " + mainFormDockPanel.Contents.Count);
        }

这是通用函数:

public static void OpenForm<T>(DockPanel dockPanel, T form = null, object obj = null, bool maximized = false) where T : class, new()
        {
            CreateMainForm();

            // Search for open forms
            foreach (DockContent frm in dockPanel).Contents)
            {
                // Verify if the content exists
                if (frm.GetType() == typeof(T) && obj == null)
                {
                    frm.Activate();
                    return;
                }
                // Check if the pressed button has a form
                if (obj != null && frm.GetType() == obj.GetType())
                {
                    frm.Activate();
                    return;
                }
            }

            if (form == null)
            {
                form = new T();
            }

            if (maximized)
                (form as DockContent).WindowState = FormWindowState.Maximized;

            Type type = typeof(T);
            MethodInfo methodInfo = type.GetMethod("Show", new Type[] { typeof(IWin32Window) });
            methodInfo.Invoke(form, new object[] { dockPanel });

            
        }

你们知道我错过了什么吗?

提前致谢!

标签: c#winformsreflectioncontainersmethodinfo

解决方案


推荐阅读