Powershell WinForms UI刷新/实时更新

时间:2013-06-12 14:26:52

标签: multithreading winforms powershell user-interface

我正在尝试使用'Register-objectevent'Cmdlet更新Winforms UI。

我要做的是让Register-ObjectEvent更新计时器上的标签。

我已经对此进行了数小时的研究,我知道这与多线程/调用有关,但我无法理解如何使其工作!

如果有人可以告诉我/帮助我让这个脚本通过计时器更新表单上的标签,那将是惊人的!我有很多可以从多线程中受益的Winforms,但我需要首先考虑它!

这是我正在努力工作的脚本,非常感谢任何帮助:)

[reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null
[reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null
[System.Windows.Forms.Application]::EnableVisualStyles() | out-null
$form1 = New-Object System.Windows.Forms.Form


$OnLoadForm_StateCorrection=
{
$form1.WindowState = $InitialFormWindowState
}
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 600
$System_Drawing_Size.Width = 1200
$form1.ClientSize = $System_Drawing_Size
$form1.MaximizeBox = $False
$form1.DataBindings.DefaultDataSourceUpdateMode = 0
$form1.KeyPreview = $True
$form1.FormBorderStyle = 1
$form1.Name = "form1"
$form1.StartPosition = 1
$form1.backcolor = [System.Drawing.Color]::FromArgb(255,240,240,240)



$timer = New-Object System.Timers.Timer
$timer.Interval = 1000 
$timer.AutoReset = $true  
$timeout = 0




$num=0
$action = { 
$num++
    write-host "test"
    $vollabel.text=$num
    $timer.stop()
}  
Register-ObjectEvent -InputObject $timer -SourceIdentifier TimerElapsed -EventName          Elapsed -Action $action
$timer.start()


$vollabel = New-Object System.Windows.Forms.Label
$vollabel.Location = "0,0"
$form1.Controls.Add($vollabel)




$InitialFormWindowState = $form1.WindowState
$form1.add_Load($OnLoadForm_StateCorrection)
$form1.Add_Shown({$form1.Activate()})
$form1.ShowDialog()| Out-Null

1 个答案:

答案 0 :(得分:0)

为了进行概念验证,我对脚本进行了一些缩减-重新添加您需要的所有内容:

to_hr

一些注意事项:

  • Form.ShowDialog()被阻止并停止脚本执行。
  • System。 Windows.Forms .Timer与System.Timers.Timer的属性略有不同,并且可以将ScriptBlock或函数名称作为add_Tick()的参数
  • 事件处理程序ScriptBlock具有自己的作用域,但是您可以使用$ ScopeName:VariableName语法共享变量。除非将范围设置为$ Script
  • ,否则我无法使$ num递增