События элементов управления Windows Forms в PowerShell - используйте Sender и EventArgs - PullRequest
0 голосов
/ 02 июля 2018

Я динамически создал несколько кнопок в цикле for и попытался обработать их событие MouseClick, а в обработчике событий попытался показать имя элемента управления, по которому щелкнули, в окне сообщения.

Проблема:

когда я нажимаю кнопку, всегда отображается имя последнего элемента управления в окно сообщения.

В C # я могу справиться с этим следующим образом: button.MouseClick+= (sender, e) => {/*...*/};. Но в PowerShell как правильно обрабатывать события элементов управления Windows Forms в PowerShell и использовать Sender и EventArgs?

Вот код для воспроизведения проблемы:

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 голосов
/ 02 июля 2018

Чтобы правильно обрабатывать события элемента управления Windows Forms в PowerShell и использовать преимущества Sender и EventArgs, вы можете использовать одну из следующих опций:

  • Определить параметры sender и e для часов сценария
  • Используйте $this и $_ Переменные

Определение параметров sender и e для блока скрипта

Подобно обработчикам лямбда-событий в C #, вы можете определить 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)")
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...