原文: http://zetcode.com/tutorials/ironpythontutorial/layout/

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

Anchor

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

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

  • TOP
  • LEFT
  • RIGHT
  • BOTTOM

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

基本Anchor示例

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

anchor.py

  1. #!/usr/bin/ipy
  2. import clr
  3. clr.AddReference("System.Windows.Forms")
  4. clr.AddReference("System.Drawing")
  5. from System.Windows.Forms import Application, Form
  6. from System.Windows.Forms import Button, AnchorStyles
  7. from System.Drawing import Size, Point
  8. class IForm(Form):
  9. def __init__(self):
  10. self.Text = 'Anchor'
  11. self.Size = Size(210, 210)
  12. btn1 = Button()
  13. btn1.Text = "Button"
  14. btn1.Parent = self
  15. btn1.Location = Point(30, 30)
  16. btn2 = Button()
  17. btn2.Text = "Button"
  18. btn2.Parent = self
  19. btn2.Location = Point(30, 80)
  20. btn2.Anchor = AnchorStyles.Right
  21. self.CenterToScreen()
  22. Application.Run(IForm())

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

  1. btn2.Anchor = AnchorStyles.Right

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

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

布局管理 - 图1

布局管理 - 图2

图:调整大小前后

Dock

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

以下是可能的DockStyle值。

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

编辑器骨架

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

editor.py

  1. #!/usr/bin/ipy
  2. import clr
  3. clr.AddReference("System.Windows.Forms")
  4. clr.AddReference("System.Drawing")
  5. from System.Windows.Forms import Application, Form, MainMenu, StatusBar
  6. from System.Windows.Forms import Shortcut, MenuItem, TextBox, DockStyle
  7. from System.Drawing import Size, Point
  8. class IForm(Form):
  9. def __init__(self):
  10. self.Text = 'Editor'
  11. self.Size = Size(210, 180)
  12. mainMenu = MainMenu()
  13. filem = mainMenu.MenuItems.Add('&File')
  14. filem.MenuItems.Add(MenuItem('E&xit',
  15. self.OnExit, Shortcut.CtrlX))
  16. self.Menu = mainMenu
  17. tb = TextBox()
  18. tb.Parent = self
  19. tb.Dock = DockStyle.Fill
  20. tb.Multiline = True
  21. sb = StatusBar()
  22. sb.Parent = self
  23. sb.Text = 'Ready'
  24. self.CenterToScreen()
  25. def OnExit(self, sender, event):
  26. self.Close()
  27. Application.Run(IForm())

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

  1. tb = TextBox()
  2. tb.Parent = self

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

  1. tb.Dock = DockStyle.Fill

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

布局管理 - 图3

图:编辑器骨架

固定按钮

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

anchoredbuttons.py

  1. #!/usr/bin/ipy
  2. import clr
  3. clr.AddReference("System.Windows.Forms")
  4. clr.AddReference("System.Drawing")
  5. clr.AddReference("System")
  6. from System.Windows.Forms import Application, Form, Button, Panel
  7. from System.Windows.Forms import DockStyle, AnchorStyles
  8. from System.Drawing import Size, Point
  9. WIDTH = 250
  10. HEIGHT = 150
  11. BUTTONS_SPACE = 15
  12. PANEL_SPACE = 8
  13. CLOSE_SPACE = 10
  14. class IForm(Form):
  15. def __init__(self):
  16. self.Text = 'Buttons'
  17. self.Size = Size(WIDTH, HEIGHT)
  18. ok = Button()
  19. PANEL_HEIGHT = ok.Height + PANEL_SPACE
  20. panel = Panel()
  21. panel.Height = PANEL_HEIGHT
  22. panel.Dock = DockStyle.Bottom
  23. panel.Parent = self
  24. x = ok.Width * 2 + BUTTONS_SPACE
  25. y = (PANEL_HEIGHT - ok.Height) / 2
  26. ok.Text = "Ok"
  27. ok.Parent = panel
  28. ok.Location = Point(WIDTH-x, y)
  29. ok.Anchor = AnchorStyles.Right
  30. close = Button()
  31. x = close.Width
  32. close.Text = "Close"
  33. close.Parent = panel
  34. close.Location = Point(WIDTH-x-CLOSE_SPACE, y)
  35. close.Anchor = AnchorStyles.Right
  36. self.CenterToScreen()
  37. Application.Run(IForm())

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

  1. WIDTH = 250
  2. HEIGHT = 150

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

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

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

  1. PANEL_HEIGHT = ok.Height + PANEL_SPACE

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

  1. panel = Panel()
  2. panel.Height = PANEL_HEIGHT
  3. panel.Dock = DockStyle.Bottom
  4. panel.Parent = self

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

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

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

布局管理 - 图4

图:固定按钮

播放器骨架

IronPython Mono Winforms 教程这一部分的最后一个示例显示了一个更复杂的示例。 它是音乐播放器的骨架。

player.py

  1. #!/usr/bin/ipy
  2. import clr
  3. clr.AddReference("System.Windows.Forms")
  4. clr.AddReference("System.Drawing")
  5. from System.Windows.Forms import Application, Form, Button, Panel
  6. from System.Windows.Forms import DockStyle, AnchorStyles, StatusBar
  7. from System.Windows.Forms import TrackBar, MainMenu, MenuItem
  8. from System.Windows.Forms import FlatStyle, TickStyle, Shortcut
  9. from System.Drawing import Size, Point, Bitmap, Color
  10. class IForm(Form):
  11. def __init__(self):
  12. self.Text = 'Player'
  13. self.Size = Size(350, 280)
  14. mainMenu = MainMenu()
  15. filem = mainMenu.MenuItems.Add("&File")
  16. playm = mainMenu.MenuItems.Add("&Play")
  17. view = mainMenu.MenuItems.Add("&View")
  18. tools = mainMenu.MenuItems.Add("&Tools")
  19. favourites = mainMenu.MenuItems.Add("&Favourites")
  20. help = mainMenu.MenuItems.Add("&Help")
  21. filem.MenuItems.Add(MenuItem("E&xit",
  22. self.OnExit, Shortcut.CtrlX))
  23. self.Menu = mainMenu
  24. panel = Panel()
  25. panel.Parent = self
  26. panel.BackColor = Color.Black
  27. panel.Dock = DockStyle.Fill
  28. buttonPanel = Panel()
  29. buttonPanel.Parent = self
  30. buttonPanel.Height = 40
  31. buttonPanel.Dock = DockStyle.Bottom
  32. pause = Button()
  33. pause.FlatStyle = FlatStyle.Popup
  34. pause.Parent = buttonPanel
  35. pause.Location = Point(5, 10)
  36. pause.Size = Size(25, 25)
  37. pause.Image = Bitmap("pause.png")
  38. play = Button()
  39. play.FlatStyle = FlatStyle.Popup
  40. play.Parent = buttonPanel
  41. play.Location = Point(35, 10)
  42. play.Size = Size(25, 25)
  43. play.Image = Bitmap("play.png")
  44. forward = Button()
  45. forward.FlatStyle = FlatStyle.Popup
  46. forward.Parent = buttonPanel
  47. forward.Location = Point(80, 10)
  48. forward.Size = Size(25, 25)
  49. forward.Image = Bitmap("forward.png")
  50. backward = Button()
  51. backward.FlatStyle = FlatStyle.Popup
  52. backward.Parent = buttonPanel
  53. backward.Location = Point(110, 10)
  54. backward.Size = Size(25, 25)
  55. backward.Image = Bitmap("backward.png")
  56. tb = TrackBar()
  57. tb.Parent = buttonPanel
  58. tb.TickStyle = TickStyle.None
  59. tb.Size = Size(150, 25)
  60. tb.Location = Point(200, 10)
  61. tb.Anchor = AnchorStyles.Right
  62. audio = Button()
  63. audio.FlatStyle = FlatStyle.Popup
  64. audio.Parent = buttonPanel
  65. audio.Size = Size(25, 25)
  66. audio.Image = Bitmap("audio.png")
  67. audio.Location = Point(170, 10)
  68. audio.Anchor = AnchorStyles.Right
  69. sb = StatusBar()
  70. sb.Parent = self
  71. sb.Text = "Ready"
  72. self.CenterToScreen()
  73. def OnExit(self, sender, event):
  74. self.Close()
  75. Application.Run(IForm())

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

  1. mainMenu = MainMenu()
  2. filem = mainMenu.MenuItems.Add("&File")
  3. ...
  4. self.Menu = mainMenu

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

  1. panel = Panel()
  2. panel.Parent = self
  3. panel.BackColor = Color.Black
  4. panel.Dock = DockStyle.Fill

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

  1. buttonPanel = Panel()
  2. buttonPanel.Parent = self
  3. buttonPanel.Height = 40
  4. buttonPanel.Dock = DockStyle.Bottom

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

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

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

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

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

布局管理 - 图5

图:播放器骨架

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