【问题标题】:How to know the name of the Winform.Event that triggers the scriptblock?如何知道触发脚本块的 Winform.Event 的名称?
【发布时间】:2022-07-06 07:10:19
【问题描述】:

我构建了一个 PSWinForm-Builder,

每个事件在 $ThreadEventHandler 列表中都有一个脚本块,它们被命名为Control.Name - Event.Name。

$ThreadEventHandler["Button1-Click"] = [ScriptBlock]{...}

当我在controler.event 上添加简单的脚本块时就可以了。

但是对于较慢的脚本块,我希望事件使用 Start-ThreadJob 带有名为 Control.Name - Event.Name 的脚本块,如果我使用 $this.Name 来表示 Control.Name 而我没有访问 $ThisEvent.Name

$Form.Button1.Add_Click({
    Start-ThreadJob -ScriptBlock $ThreadEventHandler["$($this.Name)-$($ThisEvent.Name)"]
})

您有在 Event ScriptBlock 中传输$ThisEvent.Name 的想法吗?

My Full code on GitHub

【问题讨论】:

    标签: multithreading forms powershell winforms


    【解决方案1】:

    根据您的源代码链接,我建议通过[scriptblock]::Create() 从可扩展(此处)字符串创建您的脚本块,而不是使用脚本块literal ({ ... }) ,因为这允许您将包含事件名称的$Evt 变量的值“烘焙”到脚本块中;请注意应该不预先扩展(插值)的变量引用如何将其$ sigil 转义为`$。

    $Script:ControlHandler[$Name]."Add_$($Evt)"(
      [scriptblock]::Create(@"
        param(`$caller, `$e)
        Start-ThreadJob -Name "`$(`$this.Name)-$Evt" -ScriptBlock `$Script:ThreadEventHandler["`$(`$this.Name)-$Evt"].ScriptBlock
    "@)
    )
    

    【讨论】:

      猜你喜欢
      • 2019-09-13
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 2016-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多