Question
Reafficher contrôles Winform dans un autre thread
- Florent
- Auteur du sujet
- Hors Ligne
- Membre junior
-
Réduire
Plus d'informations
- Messages : 26
- Remerciements reçus 0
il y a 9 ans 11 mois #21864
par Florent
Reafficher contrôles Winform dans un autre thread a été créé 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.
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.042 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Reafficher contrôles Winform dans un autre thread