c# MDI表单面板

本文关键字:表单 MDI | 更新日期: 2023-09-27 18:15:59

我想让面板包含一个MDI表单。我想把MainWin进入面板(progPanel),这是另一种形式的桌面应用程序。我已经使用这个c#面板作为MDI容器

我不能在没有MDI的情况下重新编码MainWin,因为这将花费很长时间,而且我将失去一些功能。

    Canvas.MainWin canvasForm = new Canvas.MainWin();
    MdiClientPanel mdiClientPan = new MdiClientPanel();
    canvasForm.MdiParent = mdiClientPan.MdiForm;
    progPanel.Controls.Add(mdiClientPan);

    public class MdiClientPanel : Panel
    {
        private Form mdiForm;
        private MdiClient ctlClient = new MdiClient();
        public MdiClientPanel()
        {
            base.Controls.Add(this.ctlClient);
        }
        public Form MdiForm
        {
            get
            {
                if (this.mdiForm == null)
                {
                    this.mdiForm = new Form();
                    //set the hidden ctlClient field which is used to determine if the form is an MDI form
                    System.Reflection.FieldInfo field = typeof(Form).GetField("ctlClient", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
                    field.SetValue(this.mdiForm, this.ctlClient);
                }
                return this.mdiForm;
            }
        }
    }

我在canvasForm.MdiParent = mdiClientPan.MdiForm;线上得到错误Form cannot be both an MDI child and MDI parent。我尝试过使用DesktopApp.ActiveForm.MdiParent并将MdiClientPanel中的形式更改为Canvas.MainWin,但没有任何工作。有什么建议吗?

c# MDI表单面板

你不能这样做。

错误信息应该足够清晰。所以应该是你链接的另一个问题的答案。

MDI被认为已经过时很多年了。用户发现它过于混乱,并且有更好的范例来统一单个容器中的多个窗口。例如,考虑一个选项卡控件。用户对此已经很熟悉了,因为现有的每个浏览器都使用选项卡来显示多个网页。

是的,重写应用程序以避免MDI需要时间。但这是你唯一的选择,因为你的想法行不通。对用户来说还有一个额外的好处。

老实说,我不太确定为什么要在面板中放置一个MDI表单。可以考虑使用浮动工具箱窗口作为替代方案。