3

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

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

前:

在此处输入图像描述

之后(在 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;
            }
        }
    }
}

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

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

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

如果您像这样打开第二个表单,则可以解决此问题:

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

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

4

3 回答 3

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;

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

锚定(之前):

在此处输入图像描述

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

在此处输入图像描述

码头(之前):

在此处输入图像描述

Dock(在调整父级之后):

在此处输入图像描述

希望这可以帮助。

于 2013-09-03T08:21:54.797 回答
0

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

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

pnl.Dock = DockStyle.Fill;

如果您确实想在某些控件旁边留出一些速度,请使用 TableLayoutPanel 来获得具有宽度(固定或百分比)的额外列/行。然后将控件(如您的面板)放在您选择的单元格中并设置dockstyle来填充。

于 2013-09-03T08:10:07.627 回答
0

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

将窗体用作 MDI 子窗体时,您确实希望将对其大小的控制委托给其 MDI 容器。只要确保你的 MDI 孩子能很好地处理它。

于 2013-09-03T08:13:37.253 回答