C# 面板在MDI容器中更改其大小
我们遇到了一个小问题,这真的让我们很恼火。让我快速解释一下我们正在做什么: 我们正在创建一个Windows窗体,将其另存为.DLL并将其加载到MDI容器中。看起来不错,但如果我们在表单中使用面板作为组件,它会改变大小 之前: 之后(在容器中): (注意面板!)。 我们猜测这是因为我们的定制MDI容器。这是我们的MDI容器的代码:C# 面板在MDI容器中更改其大小,c#,C#,我们遇到了一个小问题,这真的让我们很恼火。让我快速解释一下我们正在做什么: 我们正在创建一个Windows窗体,将其另存为.DLL并将其加载到MDI容器中。看起来不错,但如果我们在表单中使用面板作为组件,它会改变大小 之前: 之后(在容器中): (注意面板!)。 我们猜测这是因为我们的定制MDI容器。这是我们的MDI容器的代码: using System; using System.Collections.Generic; using System.Drawing; using System
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;
}
}
}
}
我们有办法解决这个问题吗?谢谢你的帮助
//编辑:
增加了赏金,因为我们想知道为什么会这样。如何复制它:
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):