#powershell #user-interface #progress-bar
Вопрос:
Либо я слишком глуп, чтобы правильно погуглить, либо проблема слишком очевидна, чтобы ее решить.
Я использую вторую небольшую форму для отображения панели выполнения при запуске функции (загрузка некоторой информации занимает некоторое время, и это добавляет некоторую приятную отзывчивость).
После завершения функции и восстановления данных форма-панель прогресса закрывается с $formbar.Close()
Если я снова вызову функцию в том же экземпляре, панель прогресса снова не отобразится, потому что она уже была удалена. Как мне это изменить? Я бы предпочел не «скрывать» панель прогресса.
$formbar = New-Object System.Windows.Forms.Form
$progressBar1 = New-Object System.Windows.Forms.ProgressBar
$formbar.ControlBox = $false
$formbar.Size = '265,45'
$formbar.StartPosition = "CenterScreen"
$progressBar1.Style = "Continuous"
$progressBar1.ForeColor = "#009374"
$ProgressRange = 1..100
$ProgressMinMax = $ProgressRange | Measure -Minimum -Maximum
$progressBar1.Location = '0,0'
$progressBar1.Size = '250,30'
$progressBar1.Visible = $True
$progressBar1.Minimum = $ProgressMinMax.Minimum
$progressBar1.Maximum = $ProgressMinMax.Maximum
$progressBar1.Step = 10
$formbar.Controls.Add($progressBar1)
$formbar.Show()
Есть какие-нибудь идеи?
Комментарии:
1. Каждый раз воссоздавайте его с нуля
Ответ №1:
Вам нужно каждый раз заново создавать всю форму целиком:
function New-ProgressBarForm {
$null = . {
$formbar = New-Object System.Windows.Forms.Form
$progressBar1 = New-Object System.Windows.Forms.ProgressBar
$formbar.ControlBox = $false
$formbar.Size = '265,45'
$formbar.StartPosition = "CenterScreen"
$progressBar1.Style = "Continuous"
$progressBar1.ForeColor = "#009374"
$ProgressRange = 1..100
$ProgressMinMax = $ProgressRange | Measure -Minimum -Maximum
$progressBar1.Location = '0,0'
$progressBar1.Size = '250,30'
$progressBar1.Visible = $True
$progressBar1.Minimum = $ProgressMinMax.Minimum
$progressBar1.Maximum = $ProgressMinMax.Maximum
$progressBar1.Step = 10
$formbar.Controls.Add($progressBar1)
}
return [pscustomobject]@{
Form = $formbar
ProgressBar = $progressBar1
}
}
Тогда позвони:
$progress = New-ProgressBarForm
$progress.Form.Show()
Когда вы хотите отобразить его
Ответ №2:
Матиас ответил на вопрос, но вы также спросили, почему, так вот почему.
Когда пользователь закрывает вашу форму, либо отклоняя форму с помощью кнопки X
или Закрыть, либо когда Form.Close()
метод закрыт, происходит следующее:
Когда форма закрыта, все ресурсы, созданные в объекте, закрываются, и форма удаляется. Вы можете предотвратить закрытие формы во время выполнения, обработав событие закрытия и установив свойство CancelEventArgs CancelEventArgs, переданное в качестве параметра обработчику событий. Если форма, которую вы закрываете, является формой запуска вашего приложения, ваше приложение завершается.
Мы можем определить, доступны ли его дескрипторы, посмотрев на свойство объекта IsDisposed
.
#before showing
PS> $formBar.IsDisposed
False
PS> $formBar.Show()
PS> $formBar.IsDisposed
True
TLDR: это связано с управлением памятью. Как только форма показана, а затем закрыта, она исчезает из памяти, но переменные, которых она коснулась, навсегда останутся в наших сердцах.