PowerShell表单 - 垂直进度条

时间:2015-05-10 14:53:29

标签: winforms user-interface powershell progress-bar

这是关于PowerShell中的Windows窗体和System.Windows.Forms.ProgressBar。

我正在寻找所有可以让进度条垂直填充的内容。我已经考虑了替代方案(例如调整背景颜色的标签),但我更喜欢使用已经有类的东西。我本来可以发誓我之前已经看到过这样的东西,即使它不是真正的进度条。我不是用它来跟踪进度,而是用于CPU使用率,RAM使用率和服务器状态的驱动器空间。这是一个有用的GUI,用于从下拉列表中快速报告服务器,我无需打开另一个完整的shell会话(我有足够的shell打开,因为它在O365电子发现,数据分析和其他需求之间) 。感谢您提前提出任何建议。

1 个答案:

答案 0 :(得分:2)

这是一个非常好的C#答案How do I make a winforms progress bar move vertically in C#?

它会覆盖CreateParams方法以在Style中设置PBS_VERTICAL标志。 为了使它在PowerShell中工作,遗憾的是你必须使用一些C#代码。

这对我有用:

$type = @'
using System; 
using System.Windows.Forms; 

public class VerticalProgressBar : ProgressBar { 
  protected override CreateParams CreateParams { 
    get { 
      CreateParams cp = base.CreateParams; 
      cp.Style |= 0x04; 
      return cp; 
    } 
  } 
}
'@

Add-Type -TypeDefinition $type -ReferencedAssemblies System.Drawing,System.Data,System.Windows.Forms

$userForm = New-Object System.Windows.Forms.Form
$userForm.Text = "$title"
$userForm.Size = New-Object System.Drawing.Size(230,300)
$userForm.StartPosition = "CenterScreen"
$userForm.AutoSize = $False
$userForm.MinimizeBox = $False
$userForm.MaximizeBox = $False
$userForm.SizeGripStyle= "Hide"
$userForm.WindowState = "Normal"
$userForm.FormBorderStyle="Fixed3D"
$progressbar = New-Object 'VerticalProgressBar'
$progressbar.Location = New-Object System.Drawing.Point(180, 50); 
$progressbar.Width = 20
$progressbar.Height = 200
$userForm.Controls.Add($progressbar)

$TrackBar = New-Object 'System.Windows.Forms.TrackBar'
$TrackBar.Location = New-Object System.Drawing.Point(10, 10); 
$TrackBar.Width = 200
$TrackBar.add_ValueChanged({$progressbar.Value = $this.value*10})
$userForm.Controls.Add($TrackBar)

$OKButton = New-Object System.Windows.Forms.Button
$OKButton.Location = New-Object System.Drawing.Size(10,220)
$OKButton.Size = New-Object System.Drawing.Size(75,23)
$OKButton.Text = "OK"
$OKButton.Add_Click({$userForm.Close()})
$userForm.Controls.Add($OKButton)


$userForm.ShowIcon = $False
$userForm.Add_Shown({$userForm.Activate()})
$userForm.AcceptButton = $OKButton
[void] $userForm.ShowDialog()