Forms PowerShell Windows窗体包装器
在PowerShell中,为小型cmdlet构建用户界面非常常见,但这所需的语法通常是部分冗余且非常冗长的。这就引出了一个问题: 是否有办法最小化所需的代码,或者是否存在PowerShell的Windows窗体包装器以减少冗长和冗余的语法?Forms PowerShell Windows窗体包装器,forms,powershell,controls,wrapper,Forms,Powershell,Controls,Wrapper,在PowerShell中,为小型cmdlet构建用户界面非常常见,但这所需的语法通常是部分冗余且非常冗长的。这就引出了一个问题: 是否有办法最小化所需的代码,或者是否存在PowerShell的Windows窗体包装器以减少冗长和冗余的语法? 我不是在寻找,因为这个解决方案是太沉重的考虑它的基础上(另请参阅:它涉及到一个PowerShell模块,这使得部署它比部署包装器函数更困难。在许多情况下,不需要使用包装器来降低代码的冗余度,例如,使用冗长的WinForms PowerShell脚本。如下代码
我不是在寻找,因为这个解决方案是太沉重的考虑它的基础上(另请参阅:它涉及到一个PowerShell模块,这使得部署它比部署包装器函数更困难。在许多情况下,不需要使用包装器来降低代码的冗余度,例如,使用冗长的WinForms PowerShell脚本。如下代码片段:
$System_Windows_Forms_Padding = New-Object System.Windows.Forms.Padding
$System_Windows_Forms_Padding.All = 3
$System_Windows_Forms_Padding.Bottom = 3
$System_Windows_Forms_Padding.Left = 3
$System_Windows_Forms_Padding.Right = 3
$System_Windows_Forms_Padding.Top = 3
$Tab1.Padding = $System_Windows_Forms_Padding
可以在WinForms中轻松简化为一行:
$Tab1.Padding = 3
如果每侧的填充不同,PowerShell将自动转换:
$Tab1.Padding = "4, 6, 4, 6"
注意:PowerShell不转换$Tab1.Padding=“3”
或$Tab1.Padding=“4,6”
尽管如此,创建windows窗体控件的本机方法还远远不够。尽管可以在创建时添加(多个)属性(使用:newobjectsystem.windows.Forms.Button-Property@{Location=“75,120”;Size=“75,23”}
),无法在以后的状态下立即设置多个属性。除此之外,添加事件1、子控件和容器属性(例如,RowSpan
)也不容易快速,或任何组合。总之,您必须反复引用windows窗体控件以设置其属性和其他属性(例如,$OKButton.=…
,如下所示):
这就是为什么我创建了一个可重用的PowerShell表单控件包装器,使您能够最大限度地减少Windows表单(WinForms)代码
1) 除非对方法使用,否则另请参见:
语法
创建控件
=表单控件[-控件][成员]
修改控件
=表单控件[-控件][成员]
向容器添加(新)控件
=表单控件[-Control |][-Member][-Add]
将容器输送到(新)控件
=|表单控件[-Control |][-Member][-Set][-PassParent]
参数
-控件|
(位置0,默认值:表单
)
-Control
参数接受Windows窗体控件类型名称([String]
)或现有窗体控件([System.Windows.Forms.Control]
)。Windows窗体控件类型名称类似,等等。
如果提供了Windows窗体控件类型名称([String]
),包装器将创建并返回一个新的Windows窗体控件,其属性和设置由其余参数定义。
如果提供了现有的Windows窗体控件([System.Windows.Forms.control]
),包装器将使用其余参数定义的属性和设置更新现有的Windows窗体控件
-会员
(职位1)
在新对象或现有对象上设置属性值、调用方法和添加事件
- 如果哈希名称在控件上表示,例如
Size=“50,50”
,则该值将分配给控件属性值
- 如果哈希名称在控件上表示,例如
Scale={1.5,1.5}
,则将使用参数值调用控件方法
- 如果哈希名称在控件上表示,例如,
Click={$Form.Close()}
,则值([ScriptBlock]
)将添加到控件事件中
两个集合属性,ColumnStyles
和RowStyles
,特别是对于被视为WPF控件的常规替代品的控件进行了简化:
-属性,清除所有列宽,并使用哈希值提供的数组重置它们。
-属性,清除所有行高度,并使用哈希值提供的数组重置它们。
注意:如果要添加或插入单个特定的ColumnStyle或RowStyle项,则需要回退本机语句,例如:[Void]$Control.Control.ColumnStyles.add((新对象Windows.Forms.ColumnStyle(“百分比”),100))
-使用PowerShell表单控件包装器在docs.microsoft.com添加:
$TextBox = Form TextBox @{Location = "10, 40"; Size = "260, 20"}
$OKButton = Form Button @{Location = "75, 120"; Size = "75, 23"; Text = "OK"; DialogResult = "OK"}
$CancelButton = Form Button @{Location = "150, 120"; Size = "75, 23"; Text = "Cancel"; DialogResult = "Cancel"}
$Result = (Form-Control Form @{
Size = "300, 200"
Text = "Data Entry Form"
StartPosition = "CenterScreen"
KeyPreview = $True
Topmost = $True
AcceptButton = $OKButton
CancelButton = $CancelButton
} -Add (
(Form Label @{Text = "Please enter the information below:"; Location = "10, 20"; Size = "280, 20"}),
$TextBox, $OKButton, $CancelButton
)
).ShowDialog()
if ($result -eq [System.Windows.Forms.DialogResult]::OK)
{
$x = $TextBox.Text
$x
}
注意1:虽然添加控件看起来更结构化,特别是对于小表单,但缺点是无法调用与父容器和子控件相关的方法(如-Set RowSpan
)。
注2:如果尝试直接在父容器中构建子控件(甚至孙子控件)(如上面的标签控件),您可能很容易在左括号和右括号中迷失方向。此外,引用这样的子控件(例如$OKButton
与$Form.controls[“OKButton”]
,假设您已设置按钮属性Name=“OKButton
)
将容器输送到(新)控件
对于本例,我创建了一个用户界面来测试dock
属性行为
$System_Windows_Forms_Padding = New-Object System.Windows.Forms.Padding
$System_Windows_Forms_Padding.All = 3
$System_Windows_Forms_Padding.Bottom = 3
$System_Windows_Forms_Padding.Left = 3
$System_Windows_Forms_Padding.Right = 3
$System_Windows_Forms_Padding.Top = 3
$Tab1.Padding = $System_Windows_Forms_Padding
此操作所需的PowerShell窗体控制代码:
$Form = Form-Control Form @{Text = "Dock test"; StartPosition = "CenterScreen"; Padding = 4; Activated = {$Dock[0].Select()}}
$Table = $Form | Form TableLayoutPanel @{RowCount = 2; ColumnCount = 2; ColumnStyles = ("Percent", 50), "AutoSize"; Dock = "Fill"}
$Panel = $Table | Form Panel @{Dock = "Fill"; BorderStyle = "FixedSingle"; BackColor = "Teal"} -Set @{RowSpan = 2}
$Button = $Panel | Form Button @{Location = "50, 50"; Size = "50, 50"; BackColor = "Silver"; Enabled = $False}
$Group = $Table | Form GroupBox @{Text = "Dock"; AutoSize = $True}
$Flow = $Group | Form FlowLayoutPanel @{AutoSize = $True; FlowDirection = "TopDown"; Dock = "Fill"; Padding = 4}
$Dock = "None", "Top", "Left", "Bottom", "Right", "Fill" | ForEach {
$Flow | Form RadioButton @{Text = $_; AutoSize = $True; Click = {$Button.Dock = $This.Text}}
}
$Close = $Table | Form Button @{Text = "Close"; Dock = "Bottom"; Click = {$Form.Close()}}
$Form.ShowDialog()
$Form = Form-Control Form @{Text = "Dock test"; StartPosition = "CenterScreen"; Padding = 4; Activated = {$Dock[0].Select()}}
$Table = $Form | Form TableLayoutPanel @{RowCount = 2; ColumnCount = 2; ColumnStyles = ("Percent", 50), "AutoSize"; Dock = "Fill"}
$Panel = $Table | Form Panel @{Dock = "Fill"; BorderStyle = "FixedSingle"; BackColor = "Teal"} -Set @{RowSpan = 2}
$Button = $Panel | Form Button @{Location = "50, 50"; Size = "50, 50"; BackColor = "Silver"; Enabled = $False}
$Group = $Table | Form GroupBox @{Text = "Dock"; AutoSize = $True}
$Flow = $Group | Form FlowLayoutPanel @{AutoSize = $True; FlowDirection = "TopDown"; Dock = "Fill"; Padding = 4}
$Dock = "None", "Top", "Left", "Bottom", "Right", "Fill" | ForEach {
$Flow | Form RadioButton @{Text = $_; AutoSize = $True; Click = {$Button.Dock = $This.Text}}
}
$Close = $Table | Form Button @{Text = "Close"; Dock = "Bottom"; Click = {$Form.Close()}}
$Form.ShowDialog()