面板在MdiContainer中更改其大小

hre*_*ult 3 c#

我们遇到了一个小问题,这让我们很烦恼.让我快速解释一下我们在做什么:

我们正在创建一个Windows窗体,将其另存为.DLL并加载一个MDIContainer.看起来很好,工作正常,但是,如果我们在Form中使用Panel作为组件,它会改变大小.

之前:

在此输入图像描述

之后(在MDIContainer中):

在此输入图像描述

(注意面板!).

我们猜测这是因为我们的自定义MDI容器.这是我们的MDI容器的代码:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace NAMESPACE.Forms
{
    class MdiClientPanel : Panel
    {
        private Form mdiForm;
        private MdiClient ctlClient = new MdiClient();

        public MdiClientPanel()
        {
            this.ctlClient.BackColor = Color.LightGray;
            base.Controls.Add(this.ctlClient);
        }

        public Form MdiForm
        {
            get
            {
                if (this.mdiForm == null)
                {
                    this.mdiForm = new 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;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

有什么方法可以解决这个问题吗?谢谢你的帮助.

//编辑:添加了赏金,因为我们想知道为什么会这样.你如何重现它:

  1. 将我们的MDIClientPanel代码复制到新项目中的新类中
  2. 创建第二个表单,在其中放置一些控件.
  3. 在MDIClient Panel中加载表单.
  4. 编译并查看第二种形式的大小是如何变化的.

如果您打开第二个表单,可以修复此问题:

SecondForm Form = new SecondForm();
Form.MdiParent = this.MdiClientPanel.mdiForm;
Form.Size.Width += 35; //THIS PART WILL FIX
Form.Size.Height += 20; //THIS PART WILL FIX IT
Form.Show();
Run Code Online (Sandbox Code Playgroud)

但这不是唯一的解决方案,它有点腥...

Hex*_*xie 6

发生这种情况的原因是因为没有设置面板的边界.

您应该能够通过以下方式之一来解决这个问题:1 - 停靠面板;

var x = new MdiClientPanel{Dock = DockStyle.Fill};
Controls.Add(x); //Add the control to the form
Run Code Online (Sandbox Code Playgroud)

2 - 将面板固定在所有角落;

x.Anchor = AnchorStyles.Top;
x.Anchor = AnchorStyles.Right;
x.Anchor = AnchorStyles.Left;
x.Anchor = AnchorStyles.Bottom;
Run Code Online (Sandbox Code Playgroud)

我能够重现此错误并使用上述方法进行纠正.

锚定(之前):

在此输入图像描述

锚定(调整父级后):

在此输入图像描述

Dock(之前):

在此输入图像描述

Dock(后调整父级):

在此输入图像描述

希望这可以帮助.