Forms PowerShell Windows窗体包装器

Forms PowerShell Windows窗体包装器,forms,powershell,controls,wrapper,Forms,Powershell,Controls,Wrapper,在PowerShell中,为小型cmdlet构建用户界面非常常见,但这所需的语法通常是部分冗余且非常冗长的。这就引出了一个问题: 是否有办法最小化所需的代码,或者是否存在PowerShell的Windows窗体包装器以减少冗长和冗余的语法? 我不是在寻找,因为这个解决方案是太沉重的考虑它的基础上(另请参阅:它涉及到一个PowerShell模块,这使得部署它比部署包装器函数更困难。在许多情况下,不需要使用包装器来降低代码的冗余度,例如,使用冗长的WinForms PowerShell脚本。如下代码

在PowerShell中,为小型cmdlet构建用户界面非常常见,但这所需的语法通常是部分冗余且非常冗长的。这就引出了一个问题: 是否有办法最小化所需的代码,或者是否存在PowerShell的Windows窗体包装器以减少冗长和冗余的语法?

我不是在寻找,因为这个解决方案是太沉重的考虑它的基础上(另请参阅:它涉及到一个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()