Откройте ту же форму снова после закрытия

#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: это связано с управлением памятью. Как только форма показана, а затем закрыта, она исчезает из памяти, но переменные, которых она коснулась, навсегда останутся в наших сердцах.