Question Reafficher contrôles Winform dans un autre thread

Plus d'informations
il y a 9 ans 11 mois #21864 par Florent
Bonjour,

Je suis confronté à un problème en rapport avec une interface WinForm Powershell. Devant rester avec PS, j'ai cherché une solution pour produire une interface qui me permet d'effectuer des tâches de fonds. Cela fonctionne en partie, mais il y a un élément que j'arrive pas à faire fonctionner.

Mon interface doit afficher à un moment donné, un label, une checkbox et un bouton (pour valider des CGU). Je ne peux pas afficher ces trois éléments au démarrage, il ne doivent s'afficher qu'a la troisieme étape de mon script.

J'arrive à les occulter au départ, à les réafficher ensuite, mais je n'arrive plus à interagir avec eux par la suite. La checkbox n'est plus cliquable.

[code:1]

#-Construction de l'interface de base
$syncHash = [hashtable]::«»Synchronized(@{})
$newRunspace =[runspacefactory]::CreateRunspace()
$newRunspace.ApartmentState = \"STA\"
$newRunspace.ThreadOptions = \"ReuseThread\"
$newRunspace.Open()
$newRunspace.SessionStateProxy.SetVariable(\"syncHash\",$syncHash)
$psCmd = [PowerShell]::Create().AddScript({
[reflection.assembly]::loadwithpartialname(\"System.Windows.Forms\"«») | Out-Null
[reflection.assembly]::loadwithpartialname(\"System.Drawing\"«») | Out-Null

#Creation de la forme parente
$syncHash.Window = New-Object System.Windows.Forms.Form
$syncHash.Window.Size = New-Object System.Drawing.Size(740,600)
$syncHash.Window.Text = \"Remote Access Manager\"
$syncHash.Window.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::FixedDialog
$syncHash.Window.MaximizeBox = $False
$syncHash.Window.MinimizeBox = $False

#Creation du panel de validation des CGU
$syncHash.PanelCGU = New-Object System.Windows.Forms.Panel
$syncHash.PanelCGU.Size = New-Object System.Drawing.Size(450,40)
$syncHash.PanelCGU.Location = New-Object System.Drawing.Size(270,530)
#$syncHash.PanelCGU.BorderStyle =\"FixedSingle\"
#Ce panel ne s'active qu'au moment voulu
#$syncHash.PanelCGU.Visible =$false
$syncHash.Window.Controls.Add($syncHash.PanelCGU)

#Creation des éléments du panel de validation des CGU
#Etiquette
$syncHash.LabelCGU = New-Object System.Windows.Forms.Label
$syncHash.LabelCGU.size = New-Object System.Drawing.Size(250,20)
$syncHash.LabelCGU.Location = New-Object System.Drawing.Size(30,10)
$syncHash.LabelCGU.Name = \"labelCGU\"
$syncHash.LabelCGU.Text = \"J'accepte les conditions générales d'utilisation\"
$syncHash.LabelCGU.Visible =$false
$syncHash.PanelCGU.Controls.Add($syncHash.LabelCGU)

#Case à cocher
$syncHash.CheckBoxCGU = New-Object System.Windows.Forms.CheckBox
$syncHash.CheckBoxCGU.size = New-Object System.Drawing.Size(30,30)
$syncHash.CheckBoxCGU.Location = New-Object System.Drawing.Size(10,5)
$syncHash.CheckboxCGU.Checked = $false
$syncHash.CheckBoxCGU.Name = \"chkboxCGU\"
$syncHash.CheckboxCGU.Visible =$false
$syncHash.PanelCGU.Controls.Add($syncHash.CheckBoxCGU)

#On associe l'état de la checkbox à l'état d'activation du bouton. Cocher active, decocher... desactive !
$syncHash.CheckBoxCGU.Add_CheckStateChanged({
$syncHash.ButtonCGU.Enabled = $syncHash.CheckBoxCGU.Checked })

#Bouton de validation des CGU
$syncHash.ButtonCGU = New-Object System.Windows.Forms.Button
$syncHash.ButtonCGU.size = New-Object System.Drawing.Size(80,30)
$syncHash.ButtonCGU.Location = New-Object System.Drawing.Size(310,5)
$syncHash.ButtonCGU.Name = \"validbtnCGU\"
$syncHash.ButtonCGU.Text = \"Continuer\"
$syncHash.ButtonCGU.Enabled =$false
$syncHash.ButtonCGU.add_Click($buttonGetElement_Click)
$syncHash.ButtonCGU.Visible =$false
$syncHash.PanelCGU.Controls.Add($syncHash.ButtonCGU)

$syncHash.Window.ShowDialog() | Out-Null
$syncHash.Error = $Error
})
$psCmd.Runspace = $newRunspace
$psCmd.BeginInvoke()
[/code:1]

Je cache donc ButtonCGU,LabelCGU,CheckBoxCGU au démarrage.

Pour tenter de reafficher :
[code:1] function Stage03-innerstep(){

$syncHash.PanelCGU.Controls.BeginInvoke([Action[String]] {
$syncHash.LabelCGU.Visible=$true
$syncHash.CheckBoxCGU.Visible=$true
$syncHash.ButtonCGU.Visible=$true
},
'normal')
Start-Sleep -Seconds 2
}[/code:1]

Mais voilà... ça reaffiche bien les contrôles, mais impossible d'interagir avec.

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.032 secondes
Propulsé par Kunena