C# 面板在MDI容器中更改其大小

C# 面板在MDI容器中更改其大小,c#,C#,我们遇到了一个小问题,这真的让我们很恼火。让我快速解释一下我们正在做什么: 我们正在创建一个Windows窗体,将其另存为.DLL并将其加载到MDI容器中。看起来不错,但如果我们在表单中使用面板作为组件,它会改变大小 之前: 之后(在容器中): (注意面板!)。 我们猜测这是因为我们的定制MDI容器。这是我们的MDI容器的代码: using System; using System.Collections.Generic; using System.Drawing; using System

我们遇到了一个小问题,这真的让我们很恼火。让我快速解释一下我们正在做什么:

我们正在创建一个Windows窗体,将其另存为.DLL并将其加载到MDI容器中。看起来不错,但如果我们在表单中使用面板作为组件,它会改变大小

之前:

之后(在容器中):

(注意面板!)。

我们猜测这是因为我们的定制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;
            }
        }
    }
}
我们有办法解决这个问题吗?谢谢你的帮助

//编辑: 增加了赏金,因为我们想知道为什么会这样。如何复制它:

  • 将MDIClientPanel代码复制到新项目中的新类中
  • 创建第二个窗体,在其中放置一些控件
  • 在MDIClient面板中加载表单
  • 编译并查看第二个表单的大小是如何变化的
  • 如果按如下方式打开第二个表单,则可以修复此问题:

    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();
    

    但这是不可能的唯一解决方案,因为它有点可疑…

    在设计时,您有一个固定的宽度和高度,但它不知何故不会按照您的形式调整自身大小

    通常我们总是使用一个表布局面板(如果同一表单上有多个可见控件),对于每个控件,将Dock设置为DockStyle.Fill。如果表单中只有一个控件,请将控件本身设置为填充到表单或父控件(如tableLayoutPanel),然后在Design或behind code中设置以下内容:

    pnl.Dock = DockStyle.Fill;
    
    如果您确实希望在某些控件旁边留出一些空间,请使用TableLayoutPanel来增加宽度为(固定或百分比)的列/行。然后将控件(如面板)放置在您选择的单元格内,并将dockstyle设置为“填充”

    考虑一下你表格中的面板。这将确保面板周围的空间相等,而不管其父窗体的大小。一般来说,我更喜欢这个而不是DockStyle.Fill


    将表单用作MDI子级时,您确实希望将对其大小的控制权委托给其MDI容器。只需确保您的MDI子级能够很好地处理它。

    之所以会发生这种情况,是因为没有设置面板的边界

    您应该能够通过以下方式之一克服此问题: 1-对接面板

    var x = new MdiClientPanel{Dock = DockStyle.Fill};
    Controls.Add(x); //Add the control to the form
    
    2-将面板锚定至所有角落

    x.Anchor = AnchorStyles.Top;
    x.Anchor = AnchorStyles.Right;
    x.Anchor = AnchorStyles.Left;
    x.Anchor = AnchorStyles.Bottom;
    
    我能够重现这个错误,并使用上述方法纠正它

    锚定(之前):

    锚定(调整父对象大小后):

    停靠(之前):

    停靠(在-调整父对象大小之后):


    希望这有帮助。

    看起来像是
    面板的
    大小
    ,或者你的
    表单
    被更改了,而不是位置。我是这样想的。改变了,不清楚。那么,你想达到什么目的呢?我想,表单在MDI容器中不会改变它的大小。这就是行不通。MdiClient实例是隐藏的,这是一个很好的理由,它是Windows自己创建的窗口的包装器。MDI是本机Windows功能。用反射来绕过这一限制,创建自己的反射或替换反射,都不会有好的结果。但是锚定不会用父项来调整自身大小。因此,我想说,这实际上取决于您的需要-您是否希望控件按照父级自行调整大小一些引用(如果需要)(MSDN);锚()船坞(MSDN):