【问题标题】:WinForm not sizing its controlsWinForm 没有调整其控件的大小
【发布时间】:2023-04-07 16:43:01
【问题描述】:

仅在某些具有“奇怪”视频大小的 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 重新处理锚点吗?还是??

【问题讨论】:

  • 锚本身应该可以工作。在您的设置中不清楚面板的滚动。 DGV 在面板内吗?
  • 刚刚添加了面板以查看其锚点是否可以工作 - 他们没有。 DGV 和面板都在表格上。谜团还在继续……
  • 您的问题没有得到足够好的记录,我们无法查看问题所在。我们需要查看设计器代码和任何其他相关代码(调整大小等)。
  • 主播也经常给我这样的问题。我更喜欢使用大量面板并将它们对接,自从我这样做以来从未遇到任何问题。将它们放在一起需要一些工作,您必须以正确的创建顺序获得所有面板,但一旦完成,它就会完美无缺。
  • LarsTech - 这个问题可以用最基本的 WinForm 重现(在我的特定环境中)。我没有对设计器代码进行任何更改 - 没有什么可记录的。 GudidoG - 去过那里 - 请注意 OP 中的面板的大小也不正确。我的大多数表单都使用 TabControl 来托管大部分控件 - 该控件也无法正确调整大小。 ToolStripContainer 和其他容器也没有。我想我希望有人能认出有修复的 VS/.Net 错误。这不是应用程序程序员级别的错误。

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


【解决方案1】:

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

下面的代码为我们工作了 90% 以上,因为我们在有问题的 PC 上需要调整表单大小的重要控件的通用名称和定位。面板 - 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

【讨论】:

    猜你喜欢
    • 2019-07-18
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多