我正在尝试调整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移动/缩放到另一个窗体(ZoomForm)。锚似乎对使用SetParent()移动的控件不起作用...更准确地说,它可能起作用,但我有重画问题。
我得到了锚/码头对工作没有重画的问题[我删除了调整大小事件wireup和调整码头填充]
ZoomForm最初没有控件。Usercontrol是动态添加到ParentForm中的。
目前,我可以用上面的代码使缩放窗体变大,但不能变小。
5条答案
按热度按时间5vf7fwbs1#
因为
Size
是实值型别,而不是指涉型别,所以该程式码会产生错误。阅读this可能有助于解释实值型别和指涉型别之间的差异。t3irkdon2#
正如recursive注解的那样,您应该只使用锚属性。
发生此错误是因为Size属性公开了一个结构而不是引用类型。Size属性返回控件的size对象的副本。写入此副本的Width和Hight属性没有任何意义,因为它只是一个临时副本,没有任何内存支持。
7d7tgy0s3#
您无法直接变更UserControl上的
Size.Width
属性,因为Size
属性是实值型别,所以变更其尺子实际上会覆写整个Size
属性。WinForms中的控件会提供自己的Width和Height属性,因此下列程式码应该可以运作:话虽如此,我同意@recursive的评论,即您可能只应该使用UserControl的
Anchor
属性使其“自动”调整大小。4sup72z84#
有些控件有MinSize(或类似的)属性。您是否有任何控件设定成无法调整较小的大小?
x759pob25#
第一部分-
首先,我建议使用UserControl的锚属性,而不是自己调整大小。它在处理窗口大小调整时非常简单,也非常可靠。
如果你想这样做,你可能应该考虑链接this.ClientSize而不是this.Height和this. Width。你可能把你的控件设置得太大了,这会使你所在的面板或其他东西失去作用,这会导致各种各样的问题。
第二部分是由于gridNameValue的Properties.Size.Width是一个结构体的成员。
当你调用gridNameValueProperties.Size时,你会返回一个Size结构体,然后试图在返回的结构体(而不是原始结构体)上设置Width。这就是为什么你需要一次性设置整个Size值类型的原因。创建一个新的Size()并将其设置为gridNameValueProperties.Size是唯一的方法。