创建和更新状态面板

时间:2014-06-19 01:47:25

标签: .net powershell paint statusbar

我试图使用一些.net在powershell中创建一个GUI,并且考虑到我编写基于GUI的程序的经验,我在更新标签时遇到了麻烦。

我只是制作一个带标签的简单表单,我希望每次读取文件夹名称时都要替换标签。我们的想法是模仿程序的状态窗口,该程序需要一些时间来运行并使用有关程序进度的信息更新面板。

这是我的代码:

$form = New-Object System.Windows.Forms.Form
$form.Height = 350
$form.Width = 600

$label = New-Object System.Windows.Forms.Label
$label.Text = "first label"
$form.Controls.Add($label)
$form.showDialog()

$dir = ls C:\ -Directory
[int]$i = 0

while($i -lt $dir.Count) {

   $label.Text = $dir[$i].Name
   $form.Controls.Add($label)
   $form.paint
   sleep 3 # Added this just to make sure I'm not missing the display
   $i++
}

我认为需要调用绘画,但我不确定如何更新GUI。

1 个答案:

答案 0 :(得分:1)

以下是您的问题的答案。我将$form.ShowDialog()替换为$form.Show()。我也在最后添加了$form.Close(),但结果对我来说并不是那么好;看看最终的PowerShell解决方案。

[void][Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
$form = New-Object System.Windows.Forms.Form
$form.Height = 350
$form.Width = 600

$label = New-Object System.Windows.Forms.Label
$label.Text = "first label"
$form.Controls.Add($label)
$form.Show()

$dir = ls C:\ -Directory
[int]$i = 0

while($i -lt $dir.Count) {

   $label.Text = $dir[$i].Name
   $form.Controls.Add($label)
   #$form.paint
   sleep 1 # Added this just to make sure I'm not missing the display
   $i++
}

$form.Close()

编码建议:考虑使用 foreach 循环,尽管 while 循环此处foreach ($file in $dir)。此处无需键入$i作为int。在脚本中尝试使用CmdLet全名(Get-ChilItem),而不是别名(ls,dir ...),即使它们是常见的别名,它也更具可读性。不要感到沮丧,你可以忘记这一点; o)

现在我的建议就决定处理问题的方式。 PowerShell提供了一些显示进度的东西。这是一个小例子:

$dirs = Get-ChildItem C:\ -Directory
$i = 0
foreach($dir in $dirs)
{
   Write-Progress -Activity "looking for Directories" -status "Found $($dir.fullname)" -percentComplete ($i*100 / $dirs.count)
   sleep 1 # Added this just to make sure I'm not missing the display
   $i++
}