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

时间:2011-02-07 17:23:04

标签: .net winforms controls

我遇到了WinForms(VB.NET)的问题。

主窗口是MDI容器。 用户打开一个新的子窗口:

non maximized child 1

然后最大化它,因此窗口正确填充客户区。我的控件已正确锚定(使用IDE属性Anchor)到窗口两侧,这样放大窗口总能很好地填充客户区:

maximized child 1

在这种状态下(客户端窗口最大化),用户打开一个不同的或新的子窗口,但新窗口控件没有拉伸,即他们不“理解”他们应该拉伸!

non stretched child 2

这特别令人烦恼,因为如果用户试图恢复窗口,那么控件就会被拉伸,所以它们就会消失(看不到列表视图了)!

restored child 2

这是一个错误吗?我怎么解决这个问题?

编辑:根据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()

我很确定问题出现在这个动态的子表单创建中,但我无法得到它。

EDIT2: 找到了!在我的形式常见的Load事件我正在做

myform.SuspendLayout()
' various instructions
myform.ResumeLayout(False)

而不是False我应该写成:myform.ResumeLayout(True)

这么简单,对不起。

4 个答案:

答案 0 :(得分:3)

我找到了解决方案,(感谢Cody Gray建议在这里发表我自己的答案)。

在我的形式常见的Load事件中我正在做:

myform.SuspendLayout()
'' various instructions
myform.ResumeLayout(False)

而不是False我应该写truemyform.ResumeLayout(True)

简单,但很棘手。 谢谢大家。

答案 1 :(得分:1)

我认为您可能想要实现的目标是使用

完成的
this.LayoutMdi(MdiLayout.TileHorizontal);

或其亲属之一。

请记住,一般不鼓励使用MDI布局。

答案 2 :(得分:0)

  
    

我的控件已正确锚定(使用IDE属性Anchor)

  

也许尝试实例化表单并在load事件中以编程方式设置属性。

如果一个实例有效,但其他实例没有,则意味着您需要使用调试器检查实例化表单的属性,以确定它们是否确实按您期望的方式设置。

答案 3 :(得分:0)

我在mdi子窗体上使用了datagridview,并且所有四个边都已锚定,只要窗体创建未最大化,它就会正确调整大小。如果我在其他子项最大化时创建了表单,则它的大小不正确,即使您手动规范化并调整表单大小,也不会自行更正。我的解决方案是在窗体上放置一个面板,四边都固定好,然后将DGV放在面板中,并将底座设置为文件。我不知道为什么我必须这样做,但它解决了这个问题。