winforms PowerShell Windows窗体-进度栏未正确显示

qcbq4gxm  于 2023-02-13  发布在  Shell
关注(0)|答案(1)|浏览(136)

我想使用Windows窗体在PowerShell中创建一个图形界面。我正在处理一个进度条,我想使用ProgressBar解决这个问题。
我的问题是,当我调用Run函数时,GUI进度条与$ProgressBar.Value值不同步。当第一个$ProgressBar.PerformStep()命令运行时,$ProgressBar.Value值已为1,但GUI进度条尚未移动。()命令时,$ProgressBar.Value值为2,但GUI仍显示值1。当第三个PerformStep()运行时,$ProgressBar.Value为3,但GUI仍为2。在运行最后一个命令(Start-Sleep 3)后,GUI最终更新并赶上$ProgressBar.Value值(3)。
(The函数只是一个示例,在真实的代码中将应用ForEach循环。)
下面是示例代码:

function Run {
$ProgressBar.Maximum = 3
$ProgressBar.Step = 1

$ProgressBar.PerformStep()
Write-Host $ProgressBar.Value
Start-Sleep 3

$ProgressBar.PerformStep()
Write-Host $ProgressBar.Value
Start-Sleep 3

$ProgressBar.PerformStep()
Write-Host $ProgressBar.Value
Start-Sleep 3

}

$MainForm = New-Object System.Windows.Forms.Form -Property @{
    Text            = "Form"
    ClientSize      = "400, 600"
}

$ProgressBar = New-Object System.Windows.Forms.ProgressBar -Property @{
    Location              = New-Object System.Drawing.Point(60, 65)
    Size                  = New-Object System.Drawing.Size(180, 10)
}

$ButtonRun = New-Object System.Windows.Forms.Button -Property @{
    Location  = New-Object System.Drawing.Point(150, 530)
    Size      = New-Object System.Drawing.Size(100, 40)
    Text      = "Run"
}
$ButtonRun.Add_Click({Run})

$MainForm.Controls.AddRange(($ProgressBar, $ButtonRun))
$MainForm.ShowDialog()

我试过在$ProgressBar.PerformStep()之后使用$ProgressBar.Refresh()或[System.Windows.Forms.Application]::DoEvents(),但这些都没有帮助。为什么会发生这种情况?我如何才能使这两个东西保持同步?
我根据Jimi的回答修改了这个函数。看起来它可以工作了。代码在技术上是正确的吗?对不起,我对PowerShell和编程还很陌生。

function Run {

$ProgressBar.Maximum = 3
$ProgressBar.Step = 1

for ($i = 1; $i -le 3; $i++) {
$ProgressBar.PerformStep()
[System.Threading.Tasks.Task]::Delay(3000).GetAwaiter().GetResult()
Write-Host $ProgressBar.Value
}
}
w1e3prcc

w1e3prcc1#

根据我的评论,在原始的沙箱虚拟机环境中,默认的只有操作系统的主机。

function Run 
{

    Add-Type -AssemblyName  System.Drawing,
                            PresentationCore,
                            PresentationFramework,
                            System.Windows.Forms,
                            microsoft.VisualBasic
    [System.Windows.Forms.Application]::EnableVisualStyles()

    $ProgressBar.Maximum = 3
    $ProgressBar.Step = 1

    $ProgressBar.PerformStep()
    Write-Host $ProgressBar.Value
    Start-Sleep 3

    $ProgressBar.PerformStep()
    Write-Host $ProgressBar.Value
    Start-Sleep 3

    $ProgressBar.PerformStep()
    Write-Host $ProgressBar.Value
    Start-Sleep 3
}

$MainForm = New-Object System.Windows.Forms.Form -Property @{
    Text            = "Form"
    ClientSize      = "400, 600"
}

$ProgressBar = New-Object System.Windows.Forms.ProgressBar -Property @{
    Location              = New-Object System.Drawing.Point(60, 65)
    Size                  = New-Object System.Drawing.Size(180, 10)
}

$ButtonRun = New-Object System.Windows.Forms.Button -Property @{
    Location  = New-Object System.Drawing.Point(150, 530)
    Size      = New-Object System.Drawing.Size(100, 40)
    Text      = "Run"
}
$ButtonRun.Add_Click({Run})

$MainForm.Controls.AddRange(($ProgressBar, $ButtonRun))
$MainForm.ShowDialog()

您不需要所有这些库,但我在这里提供了上下文选项。
https://gifyu.com/image/Sq9gw

更新

然而,如果您的代码更新对您有效,那么这只是供参考。

更新

正如我在我称之为***损坏的环境***(意味着完全加载的用户和/或开发人员工作站、MSOffice、所有最新的uOS更新、开发工具等)上所看到的,在损坏的机器上,您所看到的是可重现的,这意味着在仅安装MSOffice的主机、仅安装开发工具的主机和安装MSOffice+开发工具的主机上。

相关问题