WinForms中的锚定控件无法正确最大化

8
我遇到了WinForms(VB.NET)的问题。
主窗口是一个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)

如此简单,非常抱歉。


3
无法从屏幕截图中猜测。请将一个展示这种行为的小型重现项目发布到文件共享服务上。 - Hans Passant
4个回答

3
我发现了解决方案(感谢Cody Gray建议我在这里发布自己的答案)。
在我的表单常见的Load事件中,我正在执行以下操作:
myform.SuspendLayout()
'' various instructions
myform.ResumeLayout(False)

我应该写成true而不是Falsemyform.ResumeLayout(True)

简单,但有些棘手。 谢谢大家。


2

我认为您想要实现的目标可以使用以下方式完成:

this.LayoutMdi(MdiLayout.TileHorizontal);

或者它的相关内容。

请记住,MDI布局通常不被鼓励使用。


记住,一般情况下不鼓励使用 MDI 布局。 - Daniel Pryden
2
问题不在于 MDI 布局,而是当窗口启动时最大化时,某些原因导致锚定无法正常工作。 - vulkanino

0

我在一个MDI子窗体上使用了一个DataGridView,四个边都被锚定,只要该窗体不是最大化创建的,它就会正确地调整大小。如果我在其他子窗体最大化时创建该窗体,则其大小会错误,并且即使您手动将窗体规范化和调整大小,它也永远不会自行纠正。我的解决方案是在窗体上放置一个带有四个边缘锚定的面板,并将DGV放置在具有文件设置的面板中。我不知道为什么我必须这样做,但它确实解决了问题。


0
我的控件已经正确地锚定(使用IDE属性Anchor)
也许尝试实例化表单并在加载事件中以编程方式设置属性。
如果一个实例可以工作,但其他实例不能,那么这意味着您需要使用调试器检查实例化表单的属性,以查看它们是否按照您的期望设置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接