Я не буду писать код для вас, потому что это займет много времени и усилий, но я могу привести вам пример.
Сначала давайте создадим некоторые элементы формы и закрепим их:
Add-Type -AssemblyName System.Windows.Forms
Add-Type -AssemblyName System.Drawing
[System.Windows.Forms.Application]::EnableVisualStyles()
$Form = New-Object system.Windows.Forms.Form
$Form.ClientSize = '500,230'
$Form.text = "Some title"
$Form.StartPosition = 'CenterScreen'
$Button1 = New-Object System.Windows.Forms.Button
$Button1.Location = New-Object System.Drawing.Point(200,150)
$Button1.Size = New-Object System.Drawing.Size(100,50)
$Button1.Text = "START"
$Button1.Anchor = [System.Windows.Forms.AnchorStyles]::Top `
-bor [System.Windows.Forms.AnchorStyles]::Bottom `
-bor [System.Windows.Forms.AnchorStyles]::Left `
-bor [System.Windows.Forms.AnchorStyles]::Right
$ListBox1 = New-Object system.Windows.Forms.ListBox
$ListBox1.text = "listBox"
$ListBox1.location = New-Object System.Drawing.Point(50,50)
$ListBox1.size = New-Object System.Drawing.Size(50,50)
$ListBox1.Anchor = [System.Windows.Forms.AnchorStyles]::Top `
-bor [System.Windows.Forms.AnchorStyles]::Bottom `
-bor [System.Windows.Forms.AnchorStyles]::Left `
-bor [System.Windows.Forms.AnchorStyles]::Right
$form.Controls.AddRange(@($Button1, $ListBox1))
$Form.ShowDialog()
Как вы можете видеть прямо сейчас, размеры элементов изменяются. Попробуйте закомментировать верхний и нижний якорь и посмотреть, что произойдет.
Однако в этом решении есть большая ошибка. Если вы собираетесь изменить их размер слишком сильно, элементы начнут перекрываться. Вы можете решить эту проблему, используя (например) Panel Class , чтобы мы могли создавать различные типы макетов. Я покажу вам пример кода с TableLayoutPanel :
$tableLayoutPanel1 = New-Object System.Windows.Forms.TableLayoutPanel
$tableLayoutPanel1.RowCount = 2 #how many rows
$tableLayoutPanel1.ColumnCount = 2 #how many columns
$tableLayoutPanel1.Controls.Add($Button1, 0, 0) #choose where to place button
$tableLayoutPanel1.Controls.Add($ListBox1, 1, 1) #choose where to place listbox
$tableLayoutPanel1.Dock = [System.Windows.Forms.DockStyle]::Fill #choose style
#make rows the same size
$tableLayoutPanel1.RowStyles.Add((new-object System.Windows.Forms.RowStyle([System.Windows.Forms.SizeType]::Percent, 50)))
$tableLayoutPanel1.RowStyles.Add((new-object System.Windows.Forms.RowStyle([System.Windows.Forms.SizeType]::Percent, 50)))
#make columns the same size
$tableLayoutPanel1.ColumnStyles.Add((new-object System.Windows.Forms.ColumnStyle([System.Windows.Forms.SizeType]::Percent,50)))
$tableLayoutPanel1.ColumnStyles.Add((new-object System.Windows.Forms.ColumnStyle([System.Windows.Forms.SizeType]::Percent,50)))
$Form.controls.AddRange(@($tableLayoutPanel1)) #don't add button and listbox here because they're already added by tablelayoutpanel
$Form.ShowDialog()
Если вы хотите объединить столбцы или строки, вы можете попробовать:
$tableLayoutPanel1.SetColumnSpan($Button1,2)
или
$tableLayoutPanel1.SetRowSpan($Button1,2)
Дополнительное примечание: вы можете удалять строки с размером элементов формы и значением местоположения, потому что они не будут иметь значения, если вы используете TableLayoutPanel
. Вы можете найти рабочий код моего примера здесь .