我正在尝试在Windows窗体上获取一个UserControl(其上有一个网格)来调整大小。 以下代码是我在表单中的内容。我得到的行为是,当我把它变大时,控件会被调整大小。但它并没有缩小。我做错了什么(或)我错过了什么?
private void AdjustGrid()
{
ZoomControl.Location = new Point(5, 5);
ZoomControl.Size = new Size(this.Width - 15, this.Height - 75);
}
void zoomform_Resize(object sender, EventArgs e)
{
AdjustGrid();
}
现在用户控件具有以下代码:
//Resize the grid that the UserControl has on it
private void NameValuePropertyBag_Resize(object sender, EventArgs e)
{
grdNameValueProperties.Location = new Point(4,4);
grdNameValueProperties.Size = new Size(this.Width - 8, this.Height - 8);
}
<击> 我试过
grdNameValueProperties.Size.Width = this.Width - 8;
grdNameValueProperties.Size.Height = this.Height -8;
它给了我“无法修改表达式,因为它不是变量”错误...我错过了什么?
击>
其他信息:
我正在使用SetParent()Windows调用将UserControl移动/缩放到另一个Form(ZoomForm)。 <击> Anchor似乎不适用于使用SetParent()移动的控件...更确切地说,它可能正在工作,但我重新绘制了问题。 击>
我让Anchor / Dock对工作没有重复问题[我删除了调整大小事件连线并调整了Dock to Fill]
ZoomForm最初没有控件。 Usercontrol动态添加到ParentForm。
目前,我可以使用上面的代码使缩放形式更大,但不能更小。
答案 0 :(得分:7)
grdNameValueProperties.Size.Width = this.Width - 8;
grdNameValueProperties.Size.Height = this.Height -8;
该代码给出错误,因为Size是值类型,而不是引用类型。阅读此http://www.yoda.arachsys.com/csharp/parameters.html可能有助于解释值类型和引用类型之间的区别。
答案 1 :(得分:4)
在递归评论时,您应该只使用Anchor属性。
错误发生,因为Size属性公开结构而不是引用类型。 Size属性返回控件的size对象的副本。写入此副本的属性Width和Hight是没有意义的,因为它只是一个临时副本,而不是由内存在任何地方支持。
答案 2 :(得分:1)
您无法直接更改UserControl上的Size.Width
属性,因为Size
属性是值类型,因此更改其宽度基本上会覆盖整个Size
属性。相反,WinForms中的控件提供了自己的Width和Height属性,因此这段代码应该可以工作:
grdNameValueProperties.Width = this.Width - 8;
grdNameValueProperties.Height = this.Height - 8;
话虽如此,我同意@recursive的评论,你应该只使用UserControl的Anchor
属性来“自动”调整大小。
答案 3 :(得分:1)
目前,我可以使用上面的代码使缩放形式更大但不小。
某些控件上有一个MinSize(或类似)属性。你有任何这样的设置,你不能调整小吗?
答案 4 :(得分:0)
第一部分 -
首先,我建议在UserControl上使用Anchor属性,而不是尝试自己调整大小。它非常简单,非常可靠,用于处理窗口大小调整。
如果你想这样做,你应该看看链接off.ClientSize而不是this.Height和this.Width。你可能把你的控制设置得太大了,而且你没有考虑你所坐的面板或其他东西,这会导致各种各样的问题。
第二部分是由于gridNameValue Properties.Size.Width是结构的成员。
当你调用gridNameValueProperties.Size时,你将返回一个Size结构,然后尝试在返回的结构(而不是原始结构)上设置Width。这就是您需要一次性设置整个Size值类型的原因。创建一个新的Size()并将其设置为gridNameValueProperties.Size是使其工作的唯一方法。