我遇到了WinForms(VB.NET)的问题。
主窗口是一个MDI容器。 用户打开一个新的子窗口:
然后将其最大化,因此窗口正确地填充了客户区。我的控件已经正确地锚定(使用IDE属性Anchor)到窗口的边缘上,以便扩大窗口总是可以完美地填充客户区:
在这种状态下(客户端窗口最大化),用户打开不同或新的子窗口,但是新窗口的控件没有被拉伸,也就是说它们不“理解”它们应该如何拉伸!
这特别让人恼火,因为如果用户尝试还原窗口,那么控件会被拉伸进去,因此它们消失了(看到没有更多的列表视图)!
这是一个错误吗?我该如何解决?
编辑:根据Hans Passant的评论,我创建了一个新的简单项目,并且它按照预期工作。因此,我调查了一下我的真实项目和示例之间的区别。不同之处在于,我在我的项目中动态创建表单。
我在工具栏上动态创建了许多按钮。当用户单击按钮时,执行以下代码:
主窗口是一个MDI容器。 用户打开一个新的子窗口:
然后将其最大化,因此窗口正确地填充了客户区。我的控件已经正确地锚定(使用IDE属性Anchor)到窗口的边缘上,以便扩大窗口总是可以完美地填充客户区:
在这种状态下(客户端窗口最大化),用户打开不同或新的子窗口,但是新窗口的控件没有被拉伸,也就是说它们不“理解”它们应该如何拉伸!
这特别让人恼火,因为如果用户尝试还原窗口,那么控件会被拉伸进去,因此它们消失了(看到没有更多的列表视图)!
这是一个错误吗?我该如何解决?
编辑:根据Hans Passant的评论,我创建了一个新的简单项目,并且它按照预期工作。因此,我调查了一下我的真实项目和示例之间的区别。不同之处在于,我在我的项目中动态创建表单。
我在工具栏上动态创建了许多按钮。当用户单击按钮时,执行以下代码:
Private Sub buttonClicked(ByVal sender As System.Object, ByVal e As System.EventArgs)
Cursor.Current = Cursors.WaitCursor
Dim b As Button = CType(sender, Button)
Dim assem As Assembly = Assembly.GetExecutingAssembly()
Dim formType As Type = assem.GetType(CStr(b.Tag))
Dim exFormAsObj As Object = Nothing
Try
exFormAsObj = Activator.CreateInstance(formType)
Catch ex As Exception
Cursor.Current = Cursors.Default
MessageBox.Show("clicca meglio:" + ex.ToString)
Exit Sub
End Try
Dim f As Form = CType(exFormAsObj, Form)
f.MdiParent = Me
f.Show()
Cursor.Current = Cursors.Default
End Sub
也就是说,表单名称在按钮标签中。我使用Activator.CreateInstance(formType)
创建一个新的表单实例,然后显示它:f.Show()
。
我很确定问题出在这个动态子表单的创建上,但我不知道具体在哪里。
编辑2: 找到了!在我的表单共同加载事件中,我正在执行
myform.SuspendLayout()
' various instructions
myform.ResumeLayout(False)
我应该写true而不是False: myform.ResumeLayout(True)
如此简单,非常抱歉。