我有一個關于事件處理程式 ( Register-ObjectEvent) 的問題。這是我的代碼:
Import-Module "$PSScriptRoot\Lib\Ookii.Dialogs.Winforms.dll"
$OKButton = [Ookii.Dialogs.WinForms.TaskDialogButton]("Ok")
$NOButton = [Ookii.Dialogs.WinForms.TaskDialogButton]("No")
$CancelButton = [Ookii.Dialogs.WinForms.TaskDialogButton]("Cancel")
$HelpButton = [Ookii.Dialogs.WinForms.TaskDialogButton]("Help")
$OokieTaskDialog = New-Object Ookii.Dialogs.WinForms.TaskDialog
$OokieTaskDialog.Buttons.Add($OKButton)
$OokieTaskDialog.Buttons.Add($NOButton)
$OokieTaskDialog.Buttons.Add($CancelButton)
$OokieTaskDialog.Buttons.Add($HelpButton)
$OokieTaskDialog.MainInstruction = "Main Instruction"
$OokieTaskDialog.Content = "Eiusmod cupidatat amet officia ut cillum anim proident. Aliqua aliqua ullamco reprehenderit velit est eiusmod et aute."
$OokieTaskDialog.ExpandedInformation = "Wozarlov, Marvin Houston, (870) 487-7980"
$OokieTaskDialog.Footer = "This is the footer text <a href=`"https://www.google.com`">More Info</a>"
$OokieTaskDialog.FooterIcon = [Ookii.Dialogs.WinForms.TaskDialogIcon]::Information
$OokieTaskDialog.EnableHyperlinks = $true
Register-ObjectEvent -InputObject $OokieTaskDialog -EventName HyperlinkClicked -Action { Write-Host "Link Clicked" }
$OokieTaskDialog.WindowTitle = "Window Title"
$OokieTaskDialog.Width = 300
$OokieTaskDialog.AllowDialogCancellation = $true
$OokieTaskDialog.MainIcon = [Ookii.Dialogs.WinForms.TaskDialogIcon]::Warning
$Result = $OokieTaskDialog.ShowDialog((New-Object System.Windows.Forms.Form -Property @{TopMost = $true}))
$Result
具體來說:Register-ObjectEvent -InputObject $OokieTaskDialog -EventName HyperlinkClicked -Action { Write-Host "Link Clicked" }
事件處理程式有效,但僅在對話框關閉后顯示結果(“單擊鏈接”)。當滿足觸發條件時,如何讓事件處理程式立即回應?
例如,如果我單擊頁腳中的超鏈接 10 次,然后單擊 OK 按鈕,控制臺將列印"Link Clicked"10 次。
"Link Clicked"單擊超鏈接時,我想立即列印。
如何注冊立即觸發的事件?我究竟做錯了什么?
uj5u.com熱心網友回復:
ShowDialog與通過創建的偵聽器在同一執行緒上運行Register-ObjectEvent。在對話框關閉之前,它不會處理任何內容。
要讓腳本塊直接處理 .NET 事件,請呼叫物件的 Add-Event() 方法。
$OokieTaskDialog.Add_HyperlinkClicked({ Write-Host "Link Clicked" })
附加參考:
這個 mklement0很好的答案:How to add an Event Action handler in Powershell
摘抄
C# 以運算子 = 和 -= 的形式提供語法糖,用于附加和分離事件處理程式委托,它們看起來像賦值,但實際上被轉換為 add_() 和 remove_() 方法呼叫。
PowerShell 沒有為附加/洗掉事件處理程式提供這樣的語法糖,因此必須直接呼叫這些方法。
iRon的這個非常完整的答案: Powershell: Job Event Action with Form not executed
摘抄:
即使設定了多個執行緒,一個執行緒中也有兩個不同的“偵聽器”。當您的腳本準備好接收表單事件(使用 ShowDialog 或 DoEvents)時,它不能同時監聽 .NET 事件。反之亦然
這兩個答案本身都提供了更多的見解和參考鏈接。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/466402.html
上一篇:wp_add_inline_style()中未定義的變數
下一篇:從串列中僅選擇一個用戶
