【问题标题】:How to auto resize horizontally aligned panels in Visual Basic 2013 (.net)如何在 Visual Basic 2013 (.net) 中自动调整水平对齐面板的大小
【发布时间】:2015-01-11 11:33:29
【问题描述】:

我有 2 个面板彼此相邻对齐,如屏幕截图所示。每个面板由 3-4 个控件组成。

我想要实现的是 - 当表单大小发生变化时,面板的大小应该自动调整,保持两个面板之间的恒定间隙。

到目前为止,我已经尝试了两个面板的各种锚组合,但无法获得预期的结果。 我有点卡在这里。 (我在 Visual Basic 2013 中工作)

【问题讨论】:

  • 听起来像是TableLayoutPanel 的任务。
  • @Bjørn-RogerKringsjå 我第一次尝试只使用 TableLayoutPanel,但由于一些不明原因,我无法在单个单元格中插入多个控件。
  • @Bjørn-RogerKringsjå,在您提到后我再次尝试,我可以确认多个控件不能插入单个单元格中。然而,我实现了我想要的结果,方法是将控件保留在面板中(如原始问题的屏幕截图所示),然后将每个面板保留在 TableLayoutPanel 的单元格中。但是,我不知道这是实际的解决方案还是有什么缺点?你能告诉我应该继续这样做吗?感谢您的想法:)
  • 不,你不能。但是您不需要多个控件。您只需在第一个和第三个单元格中添加一个停靠面板。

标签: vb.net visual-studio-2010 visual-studio visual-studio-2013


【解决方案1】:
  • TableLayoutPanel 拖放到表单上,并将Dock 样式设置为Fill
  • 删除最后一行并添加一个新列。
  • 将第一列和第三列的列样式/宽度设置为percent50%
  • 将第二列的列样式/宽度设置为absolute20
  • 将面板拖放到第一个和第三个单元格中,并将Dock 样式设置为Fill
  • 在这两个面板中放置您需要的任何控件。

另外,我建议您阅读以下关于如何改进 TLP 渲染的 SO 帖子:

示例表格:

Public Class Form1

    Public Sub New()
        Me.InitializeComponent()
    End Sub

    Private Sub InitializeComponent()
        Me.TableLayoutPanel1 = New System.Windows.Forms.TableLayoutPanel()
        Me.Panel1 = New System.Windows.Forms.Panel()
        Me.Panel2 = New System.Windows.Forms.Panel()
        Me.TableLayoutPanel1.SuspendLayout()
        Me.SuspendLayout()
        '
        'TableLayoutPanel1
        '
        Me.TableLayoutPanel1.ColumnCount = 3
        Me.TableLayoutPanel1.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!))
        Me.TableLayoutPanel1.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Absolute, 20.0!))
        Me.TableLayoutPanel1.ColumnStyles.Add(New System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50.0!))
        Me.TableLayoutPanel1.Controls.Add(Me.Panel1, 0, 0)
        Me.TableLayoutPanel1.Controls.Add(Me.Panel2, 2, 0)
        Me.TableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill
        Me.TableLayoutPanel1.Location = New System.Drawing.Point(0, 0)
        Me.TableLayoutPanel1.Name = "TableLayoutPanel1"
        Me.TableLayoutPanel1.RowCount = 1
        Me.TableLayoutPanel1.RowStyles.Add(New System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100.0!))
        Me.TableLayoutPanel1.Size = New System.Drawing.Size(682, 260)
        Me.TableLayoutPanel1.TabIndex = 1
        '
        'Panel1
        '
        Me.Panel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
        Me.Panel1.Dock = System.Windows.Forms.DockStyle.Fill
        Me.Panel1.Location = New System.Drawing.Point(3, 3)
        Me.Panel1.Name = "Panel1"
        Me.Panel1.Size = New System.Drawing.Size(325, 254)
        Me.Panel1.TabIndex = 0
        '
        'Panel2
        '
        Me.Panel2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle
        Me.Panel2.Dock = System.Windows.Forms.DockStyle.Fill
        Me.Panel2.Location = New System.Drawing.Point(354, 3)
        Me.Panel2.Name = "Panel2"
        Me.Panel2.Size = New System.Drawing.Size(325, 254)
        Me.Panel2.TabIndex = 1
        '
        'Form1
        '
        Me.AutoScaleDimensions = New System.Drawing.SizeF(8.0!, 16.0!)
        Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
        Me.ClientSize = New System.Drawing.Size(682, 260)
        Me.Controls.Add(Me.TableLayoutPanel1)
        Me.Name = "Form1"
        Me.Text = "Form1"
        Me.TableLayoutPanel1.ResumeLayout(False)
        Me.ResumeLayout(False)

    End Sub

    Friend WithEvents TableLayoutPanel1 As System.Windows.Forms.TableLayoutPanel
    Friend WithEvents Panel1 As System.Windows.Forms.Panel
    Friend WithEvents Panel2 As System.Windows.Forms.Panel

End Class

【讨论】:

  • 好极了,我在上次对我的问题的评论中试图说的基本相同。但你的代表是最好的。
  • @Dr.AtulTiwari 太棒了!您还应该访问在我的编辑中添加的链接。
  • 我查看了您提供的链接,但无法将其转换为 Visual Basic。我不知道 C#。我尝试了在线转换器,但它们都返回了很多错误的代码,我无法解决。你能帮我如何不减慢tablelayoutpanel。谢谢。
  • 我使用converter.telerik.com 没有任何问题。请务必在表单的ResizeBegin / ResizeEnd 事件中调用BeginUpdate / EndUpdate
  • 谢谢。在您的帮助下,我已成功转换代码。最终我知道了,我忘记为DllImport 导入System.Runtime.InteropServices,但我仍然无法将它实现到ResizeBegin,所以我认为现在应该将它作为一个单独的问题提出。它的链接是Link
【解决方案2】:

只需将左侧面板的dock设置为左,右一到右!

【讨论】:

  • 这将不会缩放也不会保持“两个面板之间的恒定间隙”
  • @Bjørn-RogerKringsjå,你说得对,我也尝试过对接,但对接会导致同样的问题,正如你所提到的。
猜你喜欢
  • 2013-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
  • 2010-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多