WinForm没有调整其控件的大小

时间:2015-09-25 22:16:05

标签: vb.net winforms visual-studio-2013 .net-4.0

仅在一些具有“奇怪”视频大小的PC上,WinForm应用程序无法正确设置锚定控件的大小。奇怪,例如用作VGA设备的电视。调整大小在Win7桌面上运行正常,但我需要该应用程序在会议室中工作相同。

Private Sub frmSearch2_ResizeEnd(sender As Object, e As EventArgs) Handles Me.ResizeEnd
    Dim s As String = ""
    s &= "me.size " & Me.Size.ToString & vbNewLine
    s &= "Me.ClientSize " & Me.ClientSize.ToString & vbNewLine
    s &= "dgv size: " & dgv01.Size.ToString & vbNewLine ' initially incorrect
    s &= "panel size: " & Panel1.Size.ToString ' initially incorrect
    Clipboard.SetText(s)
    dgv01.Width = Me.ClientSize.Width - (dgv01.Left * 2) ' manually set width based on ClientSize
End Sub

在问题PC上执行:

me.size {Width=941, Height=578}
Me.ClientSize {Width=925, Height=540}
dgv size: {Width=939, Height=361}
panel size: {Width=964, Height=52}

请注意,dgv比客户端区域宽,即使它固定在所有方面。高度正在调整大小。我添加了一个停靠在左右边缘的面板,看它是否会正确调整大小 - 不。更改AutoScaleMode似乎没有帮助 - 没有尝试所有可能性。请记住:缩放适用于大多数PC。

手动设置DGV宽度的最后一行代码在视觉上是正常的。这对于一个非常简单的表单来说没问题,但是我有很多控件,其中一些控件需要同样的注意。

可能是视频驱动程序问题,但代码显示WinForm具有正确的ClientSize,它只是没有使用该值来调整控件的大小。

我可以调用强制WinForm使用有效的ClientSize重新处理锚点吗?或??

1 个答案:

答案 0 :(得分:0)

这是一个奇怪的问题......有些WinForms会遇到问题而有些则没有。我无法确定相关的差异。

下面的代码对我们来说效率为90 +%,因为我们在需要在问题PC上调整大小的表单上有重要控件的常用名称和位置。 Panel-pnlResizer - 被添加到一些必须在问题PC上运行的表单中 - 它包含大多数其他重要控件。

    Try
        ' try to deal with bad video drivers
        Dim ctl() As Control = frm.Controls.Find("TabControl1", False)
        If ctl.Length = 1 AndAlso (ctl(0).Width + ctl(0).Left) > frm.ClientSize.Width Then
            ctl(0).Width = frm.ClientSize.Width - ctl(0).Left - 5
        End If
        ctl = frm.Controls.Find("StatusStrip1", False)
        If ctl.Length = 1 AndAlso (ctl(0).Width + ctl(0).Left) > frm.ClientSize.Width Then
            ctl(0).Width = frm.ClientSize.Width
        End If
        ctl = frm.Controls.Find("ToolStrip1", False)
        If ctl.Length = 1 AndAlso (ctl(0).Width + ctl(0).Left) > frm.ClientSize.Width Then
            ctl(0).Width = frm.ClientSize.Width - ctl(0).Left - 5
        End If
        ctl = frm.Controls.Find("pnlResizer", False)
        If ctl.Length = 1 AndAlso (ctl(0).Width + ctl(0).Left) > frm.ClientSize.Width Then
            ctl(0).Width = frm.ClientSize.Width - ctl(0).Left - 5
        End If
    Catch ex As Exception

    End Try