Как определить, откуда вызываются обработчики событий Powershell? - PullRequest
1 голос
/ 31 октября 2019

У меня есть скрипт PowerShell, который создает графический интерфейс WinForms. На главной форме есть большое количество кнопок (PushButtons), каждая из которых имеет свое имя / текст. Я пытаюсь найти способ итеративно назначать каждой кнопке прослушиватель событий щелчка, который записывает имя соответствующей кнопки в консоль. Проблема заключается в том, что всякий раз, когда вызывается функция (функция, в которую я изначально передал "$ button.Add_Click ({function}) "), я не совсем уверен, как ссылаться на / получить доступ к имени кнопки из этой функции. Это почти как если бы я больше не находился в области нажатия кнопки, поэтому у меня больше нет доступа к кнопке.

Пример:

$ButtonArray.ForEach({
    $_.Add_Click({ Say-Name })
})

function Say-Name() {
    Write-Host # How do I access the button's properties?
}

ВПример выше, я застрял в части Write-Host. Я пытался использовать $_ для ссылки на кнопку, но оказалось, что $_ на самом деле ссылается на System.Windows.Forms.MouseEventArgs объект. Я попытался передать параметры через блок скрипта Add_Click, но это не сработало, потому что, как только я вошел в блок скрипта, у меня нет доступа к какой-либо внешней информации. Как я могу сообщить своей функции, какая кнопка ее вызывает?

1 Ответ

0 голосов
/ 31 октября 2019

Блоки скриптов, передаваемые в .add_<event>() методы (эквивалент .<event> += в C #), действуют как EventHandler делегатов и, следовательно, передаются два аргумента:

  • отправитель (исходный объект): в вашем случае [System.Windows.Forms.Button], вызвавший событие.

  • аргументы события (подробности): экземпляр типа, производный от [System.EventArgs] или, для событий без аргументов, [System.EventArgs]::Empty singleton;эта информация также неявно отражена в автоматической переменной $_.

Поэтому, чтобы получить имя элемента управления под рукой, объявляет эти параметры, чтобы вы могли получить к ним доступ:

$_.add_Click({ 
  param($sender, $eventArgs)
  $buttonName = $sender.Name
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...