面板在MdiContainer中更改其大小

时间:2013-08-31 19:50:33

标签: c#

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

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

在:

enter image description here

之后(在MDIContainer中):

enter image description here

(注意面板!)。

我们猜测这是因为我们的自定义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;
            }
        }
    }
}

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

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

  1. 将我们的MDIClientPanel代码复制到新项目的新类中
  2. 创建第二个表单,在其中加入一些控件。
  3. 将表单加载到MDIClient Panel中。
  4. 编译并查看第二种表单的大小是如何变化的。
  5. 如果您打开第二个表单,可以修复此问题:

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

    但这是唯一的解决方案,但它有点可疑......

3 个答案:

答案 0 :(得分:6)

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

您应该可以通过以下方式之一来解决这个问题: 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;

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

锚定(之前):

enter image description here

锚定(在调整父级之后):

enter image description here

Dock(之前):

enter image description here

Dock(调整后的父级):

enter image description here

希望这有帮助。

答案 1 :(得分:0)

你在设计时有一个固定的宽度和高度,它不知道你的表单不会调整自己的大小。

通常我们所做的就是使用表格布局面板(如果同一表格上有多个可见控件),并且对于每个控件,将Dock设置为DockStyle.Fill。如果表单中只有一个控件,则将控件本身设置为填写表单或父控件(例如tableLayoutPanel),然后在Design或后面的代码中设置以下内容:

pnl.Dock = DockStyle.Fill;

如果你想在一些控件旁边留一些步调,请使用TableLayoutPanel来增加额外的列/行宽度(固定或百分比)。然后将控件(如面板)放在您选择的单元格中,并将dockstyle设置为fill。

答案 2 :(得分:0)

在表单中考虑anchoring面板。这将确保面板周围具有相等的空间,无论其父表单的大小。一般来说,我更喜欢DockStyle.Fill

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