Windows窗体在PowerShell中控制事件-使用Sender和EventArgs

时间:2018-07-02 06:57:38

标签: c# winforms powershell events

我已经在for循环中动态创建了一些按钮,并尝试处理其MouseClick事件,并在事件处理程序中,尝试在消息框中显示单击的控件的名称。 / p>

问题是:

  

当我单击一个按钮时,它总是显示最后一个控件的名称   消息框。

在C#中,我可以像处理button.MouseClick+= (sender, e) => {/*...*/};那样处理它。但是在PowerShell中,如何正确处理PowerShell中Windows窗体控件的事件并使用SenderEventArgs

以下是重现该问题的代码:

Add-Type -AssemblyName System.Windows.Forms
$form = New-Object System.Windows.Forms.Form
$flp = New-Object System.Windows.Forms.FlowLayoutPanel
$flp.AutoScroll = $true
$flp.Dock = [System.Windows.Forms.DockStyle]::Fill
$form.Controls.Add($flp)
for($i = 0; $i -lt 10; $i++){
    $button = New-Object System.Windows.Forms.Button
    $button.Name = "Button_$i"
    $button.Text = "Button $i"
    $button.Add_MouseClick({
        [System.Windows.Forms.MessageBox]::Show("$($button.Name)")
    })
    $flp.Controls.Add($button)
}
$form.ShowDialog() | Out-Null
$form.Dispose()

1 个答案:

答案 0 :(得分:3)

要在PowerShell中正确处理Windows窗体控件的事件并利用SenderEventArgs,可以使用以下任一选项:

  • 为脚本时钟定义sendere参数
  • 使用$this$_变量

为脚本块定义sendere参数

就像C#中的lambda事件处理程序一样,您可以为脚本块定义param($sender,$e)

$button.Add_MouseClick({param($sender,$e)
    [System.Windows.Forms.MessageBox]::Show(" $($sender.Name) `n $($e.Location)")
})

使用$this$_变量

$this是事件的发送者,$_是事件的参数:

$button.Add_MouseClick({
    [System.Windows.Forms.MessageBox]::Show(" $($this.Name) `n $($_.Location)")
})