Первый ответ Почему он добавляется.
В графической программе Windows поток, создающий окно, должен зацикливаться в насосе сообщений, чтобы перераспределять (переводить) сообщения, приходящие от пользователя.действие для событий в его Windows.
В модальном окне модальный код, который обрабатывает отображение окна, запускает свой собственный цикл обработки сообщений и не возвращается, пока окно не будет закрыто.Вот почему код после ShowDialog()
не будет выполняться до тех пор, пока окно не будет закрыто.
Show()
, просто попросите показать окно, но если нет цикла насоса для управления сообщениями, поступающими от действий пользователя, он просто зависает.
Второй простой способ иметь два потока
При запуске задания CmdLet используется другой поток из пула, выделенного Powershell, поэтому он создает диалогнемодальный, и он не замерзает.
function goForm
{
[void][reflection.assembly]::LoadWithPartialName("System.Windows.Forms")
$file = (get-item 'C:\temp\jpb.png')
#$file = (get-item "c:\image.jpg")
$img = [System.Drawing.Image]::Fromfile($file);
# This tip from /3333425/formy-windows-vyglyadyat-po-raznomu-v-powershell-i-powershell-ise-zachem#3333431
[System.Windows.Forms.Application]::EnableVisualStyles();
$form = new-object Windows.Forms.Form
$form.Text = "Image Viewer"
$form.Width = $img.Size.Width;
$form.Height = $img.Size.Height;
$pictureBox = new-object Windows.Forms.PictureBox
$pictureBox.Width = $img.Size.Width;
$pictureBox.Height = $img.Size.Height;
$pictureBox.Image = $img;
$form.controls.add($pictureBox)
$form.Add_Shown( { $form.Activate() } )
$form.ShowDialog()
}
Clear-Host
start-job $function:goForm
$name = Read-Host "What is you name"
Write-Host "your name is $name"