Primera respuesta Por qué se agrega.
En un programa gráfico de Windows, el hilo que crea una ventana debe crear un bucle en una bomba de mensajes para redistribuir (traducir) mensajes provenientes de la acción del usuario a eventos en su Windows.
En una ventana modal, el código modal que maneja la visualización de la ventana ejecuta su propio bucle de bomba de mensajes y no regresa hasta que se cierra la ventana. Es por eso que el código después de ShowDialog()
no se ejecutará hasta que se cierre la ventana.
Show()
, solo solicite mostrar la ventana, pero si no hay ningún bucle de bomba para administrar los mensajes provenientes de la acción del usuario, simplemente se congela.
Segundo una forma sencilla de tener dos hilos
el cmdlet Start-Job utilizar otro hilo de la piscina asignado por Powershell lo que hace que el diálogo no modal, y no se congela.
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 http://stackoverflow.com/questions/3358372/windows-forms-look-different-in-powershell-and-powershell-ise-why/3359274#3359274
[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"
Show() podría no ser una buena idea : http: // stackoverflow.com/questions/2192558/why-do-a-form-displayed-by-powershell-sometimes-not-show-up – keyboardP
Esa es una buena referencia. –