原文: http://zetcode.com/gui/vbwinforms/layout/

Mono Winforms 教程继续进行控件的布局管理。 在将控件放置在其父容器上之后,我们必须确保它们的布局正确。

Anchor

控件的Anchor属性确定如何使用其父控件调整其大小。 锚是海洋世界中的一个术语。 当船锚掉入水中时,船就固定在某个地方。 Winforms 控件也是如此。

Winforms 中的每个控件都可以具有以下AnchorStyles值之一:

  • TOP
  • LEFT
  • RIGHT
  • BOTTOM

注意,控件不限于一个值。 他们可以使用|取这些值的任何组合。 运算符。

基本Anchor示例

下面的示例显示一个非常基本的示例,演示Anchor属性。

  1. ' ZetCode Mono Visual Basic Winforms tutorial
  2. '
  3. ' This program demonstrates the Anchor property
  4. '
  5. ' author jan bodnar
  6. ' last modified May 2009
  7. ' website www.zetcode.com
  8. Imports System.Windows.Forms
  9. Imports System.Drawing
  10. Public Class WinVBApp
  11. Inherits Form
  12. Public Sub New
  13. Me.Text = "Check menu item"
  14. Me.Size = New Size(380, 220)
  15. Me.InitUI
  16. Me.CenterToScreen
  17. End Sub
  18. Private Sub InitUI
  19. Me.Text = "Anchor"
  20. Size = New Size(210, 210)
  21. Dim btn1 As New Button
  22. btn1.Text = "Button"
  23. btn1.Parent = Me
  24. btn1.Location = New Point(30, 30)
  25. Dim btn2 As New Button
  26. btn2.Text = "Button"
  27. btn2.Parent = Me
  28. btn2.Location = New Point(30, 80)
  29. btn2.Anchor = AnchorStyles.Right
  30. Me.CenterToScreen
  31. End Sub
  32. Public Shared Sub Main
  33. Application.Run(New WinVBApp)
  34. End Sub
  35. End Class

这是一个非常基本的代码示例,清楚地显示了Anchor属性的含义。 我们在表单上有两个按钮。 第一个按钮具有默认的AnchorStyles值,即AnchorStyles.Left。 第二个按钮已显式设置AnchorStyles.Right

  1. btn2.Anchor = AnchorStyles.Right

我们将第二个按钮的Anchor属性明确设置为AnchorStyles。 正确的值。

现在看看以下两个图像。 左边的是开始时显示的应用。 调整大小后,右侧显示相同的应用。 第一个按钮与表单的左边界和上边界保持距离。 第二个按钮与表单的右边框保持距离。 但是它在垂直方向上没有保持任何距离。

布局管理 - 图1

布局管理 - 图2

图:调整大小前后

Dock

Dock属性允许我们将控件粘贴到父窗体或控件的特定边缘。

以下是可能的DockStyle值。

  • TOP
  • LEFT
  • RIGHT
  • BOTTOM
  • FILL
  • NONE

编辑器骨架

以下代码示例演示了正在使用的Dock属性。

  1. ' ZetCode Mono Visual Basic Winforms tutorial
  2. '
  3. ' This program demonstrates the Dock property
  4. '
  5. ' author jan bodnar
  6. ' last modified May 2009
  7. ' website www.zetcode.com
  8. Imports System.Windows.Forms
  9. Imports System.Drawing
  10. Public Class WinVBApp
  11. Inherits Form
  12. Public Sub New
  13. Me.Text = "Editor"
  14. Me.Size = New Size(220, 170)
  15. Me.InitUI
  16. Me.CenterToScreen
  17. End Sub
  18. Private Sub InitUI
  19. Dim mainMenu As New MainMenu
  20. Dim file As MenuItem = mainMenu.MenuItems.Add("&File")
  21. file.MenuItems.Add(New MenuItem("E&xit", _
  22. New EventHandler(AddressOf Me.OnExit), Shortcut.CtrlX))
  23. Menu = mainMenu
  24. Dim tb As New TextBox
  25. tb.Parent = Me
  26. tb.Dock = DockStyle.Fill
  27. tb.Multiline = True
  28. Dim sb As New StatusBar
  29. sb.Parent = Me
  30. sb.Text = "Ready"
  31. End Sub
  32. Private Sub OnExit(ByVal sender As Object, ByVal e As EventArgs)
  33. Me.Close
  34. End Sub
  35. Public Shared Sub Main
  36. Application.Run(New WinVBApp)
  37. End Sub
  38. End Class

我们显示一个菜单栏和一个状态栏。 其余区域由TextBox控件占用。

  1. Dim tb As New TextBox
  2. tb.Parent = Me

在这里,我们创建TextBox控件。 Form容器被设置为文本框的父级。

  1. tb.Dock = DockStyle.Fill

此代码行使TextBox控件占用了表单容器内的剩余空间。

布局管理 - 图3

图:编辑器骨架

固定按钮

下一个示例显示了位于窗体右下角的两个按钮。

  1. ' ZetCode Mono Visual Basic Winforms tutorial
  2. '
  3. ' This program positions two buttons
  4. ' in the bottom right corner of
  5. ' the window
  6. '
  7. ' author jan bodnar
  8. ' last modified May 2009
  9. ' website www.zetcode.com
  10. Imports System.Windows.Forms
  11. Imports System.Drawing
  12. Public Class WinVBApp
  13. Inherits Form
  14. Private Const WIDTH = 250
  15. Private Const HEIGHT = 150
  16. Private Const BUTTONS_SPACE = 15
  17. Private Const PANEL_SPACE = 8
  18. Private Const CLOSE_SPACE = 10
  19. Public Sub New
  20. Me.Text = "Buttons"
  21. Me.Size = New Size(WIDTH, HEIGHT)
  22. Me.InitUI
  23. Me.CenterToScreen
  24. End Sub
  25. Private Sub InitUI
  26. Dim ok As New Button
  27. Dim panelHeight As New Integer = ok.Height + PANEL_SPACE
  28. Dim panel As New Panel
  29. panel.Height = panelHeight
  30. panel.Dock = DockStyle.Bottom
  31. panel.Parent = Me
  32. Dim x As Integer = ok.Width * 2 + BUTTONS_SPACE
  33. Dim y As Integer = (panelHeight - ok.Height) / 2
  34. ok.Text = "Ok"
  35. ok.Parent = panel
  36. ok.Location = New Point(WIDTH-x, y)
  37. ok.Anchor = AnchorStyles.Right
  38. Dim close As New Button
  39. x = close.Width
  40. close.Text = "Close"
  41. close.Parent = panel
  42. close.Location = New Point(WIDTH-x-CLOSE_SPACE, y)
  43. close.Anchor = AnchorStyles.Right
  44. End Sub
  45. Private Sub OnExit(ByVal sender As Object, ByVal e As EventArgs)
  46. Me.Close
  47. End Sub
  48. Public Shared Sub Main
  49. Application.Run(New WinVBApp)
  50. End Sub
  51. End Class

该示例在对话框的右下角显示确定,关闭按钮,这在对话框窗口中很常见。

  1. Private Const WIDTH = 250
  2. Private Const HEIGHT = 150

WIDTHHEIGHT变量确定应用窗口的宽度和高度。

  1. Private Const BUTTONS_SPACE = 15
  2. Private Const PANEL_SPACE = 8
  3. Private Const CLOSE_SPACE = 10

BUTTONS_SPACE是“确定”和“关闭”按钮之间的空间。 PANEL_SPACE是面板和表单底部之间的空间。 最后,CLOSE_SPACE变量设置“关闭”按钮和表单右边框之间的间隔。

  1. Dim panelHeight As New Integer = ok.Height + PANEL_SPACE

在这里,我们计算面板的高度。 面板的高度基于“确定”按钮的高度。 并且我们添加了一些额外的空间,以使按钮不会太靠近边框。

  1. Dim panel As New Panel
  2. panel.Height = panelHeight
  3. panel.Dock = DockStyle.Bottom
  4. panel.Parent = Me

在这里,我们创建和管理Panel控件。 在此示例中,它用作按钮的容器。 它被粘贴到表单的底部边框。 然后将按钮放置在面板内。

  1. ok.Text = "Ok"
  2. ok.Parent = panel
  3. ok.Location = New Point(WIDTH-x, y)
  4. ok.Anchor = AnchorStyles.Right

“确定”按钮的父级设置为面板控件。 计算位置。 并且Anchor属性设置为右侧。 另一个按钮的创建类似。

布局管理 - 图4

图:固定按钮

播放器骨架

本部分最后的示例显示了一个更复杂的示例。 它是音乐播放器的骨架。

  1. ' ZetCode Mono Visual Basic Winforms tutorial
  2. '
  3. ' This program creates a skeleton of
  4. ' a music player.
  5. '
  6. ' author jan bodnar
  7. ' last modified June 2009
  8. ' website www.zetcode.com
  9. Imports System.Windows.Forms
  10. Imports System.Drawing
  11. Public Class WinVBApp
  12. Inherits Form
  13. Public Sub New
  14. Me.Text = "Player"
  15. Me.Size = New Size(350, 280)
  16. Me.InitUI
  17. Me.CenterToScreen
  18. End Sub
  19. Private Sub InitUI
  20. Dim mainMenu As New MainMenu
  21. Dim file As MenuItem = mainMenu.MenuItems.Add("&File")
  22. Dim playm As MenuItem = mainMenu.MenuItems.Add("&Play")
  23. Dim view As MenuItem = mainMenu.MenuItems.Add("&View")
  24. Dim tools As MenuItem = mainMenu.MenuItems.Add("&Tools")
  25. Dim favourites As MenuItem = mainMenu.MenuItems.Add("&Favourites")
  26. Dim help As MenuItem = mainMenu.MenuItems.Add("&Help")
  27. file.MenuItems.Add(New MenuItem("E&xit", _
  28. New EventHandler(AddressOf Me.OnExit), Shortcut.CtrlX))
  29. Menu = mainMenu
  30. Dim panel As New Panel
  31. panel.Parent = Me
  32. panel.BackColor = Color.Black
  33. panel.Dock = DockStyle.Fill
  34. Dim buttonPanel As New Panel
  35. buttonPanel.Parent = Me
  36. buttonPanel.Height = 40
  37. buttonPanel.Dock = DockStyle.Bottom
  38. Dim pause As New Button
  39. pause.FlatStyle = FlatStyle.Popup
  40. pause.Parent = buttonPanel
  41. pause.Location = New Point(5, 10)
  42. pause.Size = New Size(25, 25)
  43. pause.Image = New Bitmap("pause.png")
  44. Dim play As New Button
  45. play.FlatStyle = FlatStyle.Popup
  46. play.Parent = buttonPanel
  47. play.Location = New Point(35, 10)
  48. play.Size = New Size(25, 25)
  49. play.Image = New Bitmap("play.png")
  50. Dim forward As New Button
  51. forward.FlatStyle = FlatStyle.Popup
  52. forward.Parent = buttonPanel
  53. forward.Location = New Point(80, 10)
  54. forward.Size = New Size(25, 25)
  55. forward.Image = New Bitmap("forward.png")
  56. Dim backward As New Button
  57. backward.FlatStyle = FlatStyle.Popup
  58. backward.Parent = buttonPanel
  59. backward.Location = New Point(110, 10)
  60. backward.Size = New Size(25, 25)
  61. backward.Image = New Bitmap("backward.png")
  62. Dim tb As = New TrackBar
  63. tb.Parent = buttonPanel
  64. tb.TickStyle = TickStyle.None
  65. tb.Size = New Size(150, 25)
  66. tb.Location = New Point(200, 10)
  67. tb.Anchor = AnchorStyles.Right
  68. Dim audio As New Button
  69. audio.FlatStyle = FlatStyle.Popup
  70. audio.Parent = buttonPanel
  71. audio.Size = New Size(25, 25)
  72. audio.Image = New Bitmap("audio.png")
  73. audio.Location = New Point(170, 10)
  74. audio.Anchor = AnchorStyles.Right
  75. Dim sb As New StatusBar
  76. sb.Parent = Me
  77. sb.Text = "Ready"
  78. Me.CenterToScreen
  79. End Sub
  80. Private Sub OnExit(ByVal sender As Object, ByVal e As EventArgs)
  81. Me.Close
  82. End Sub
  83. Public Shared Sub Main
  84. Application.Run(New WinVBApp)
  85. End Sub
  86. End Class

这是一个更复杂的示例,它同时显示了DockAnchor属性。

  1. Dim mainMenu As New MainMenu
  2. Dim file As MenuItem = mainMenu.MenuItems.Add("&File")
  3. ...
  4. Menu = mainMenu

在这里,我们创建菜单栏。

  1. Dim panel As New Panel
  2. panel.Parent = Me
  3. panel.BackColor = Color.Black
  4. panel.Dock = DockStyle.Fill

这是黑色的面板,占据了菜单栏,状态栏和控制面板剩余的所有剩余空间。

  1. Dim buttonPanel As New Panel
  2. buttonPanel.Parent = Me
  3. buttonPanel.Height = 40
  4. buttonPanel.Dock = DockStyle.Bottom

这是控制面板。 它的父级是表单容器。 它被粘贴到表格的底部。 高度为 40 像素。 在此控制面板内部,我们放置了所有按钮和轨迹仪。

  1. Dim pause As New Button
  2. pause.FlatStyle = FlatStyle.Popup
  3. pause.Parent = buttonPanel
  4. pause.Location = New Point(5, 10)
  5. pause.Size = New Size(25, 25)
  6. pause.Image = New Bitmap("pause.png")

暂停按钮是具有默认Anchor属性值的四个按钮之一。 该按钮的样式设置为平面,因为它看起来更好。 我们在按钮上放置一个位图。

  1. tb.Anchor = AnchorStyles.Right
  2. ...
  3. audio.Anchor = AnchorStyles.Right

最后两个控件固定在右侧。

布局管理 - 图5

图:播放器骨架

Mono Visual Basic Winforms 教程的这一部分是关于控件的布局管理的。 我们实践了 Winforms 库提供的各种可能性。