2016-07-21 5 views
0

In meiner Powershell GUI habe ich zwei Modi: Verbindung und Verbindungsabbau. Für jede gibt es eine Liste von Schritt. Diese Liste wird aus einem XML-Dokument gelesen und dann als Beschriftung für jeden Schritt in ein Layout-Bedienfeld geladen. Wenn ich also 8 Schritte für die Verbindung habe, werden 8 Labels im Flowlayout-Panel erstellt.Wie füge ich Label aus einem anderen Runspace in einer Powershell GUI hinzu?

Ich möchte Etiketten dynamisch ändern, wenn sich mein Modus ändert. Wenn ich im Verbindungsmodus bin und zum Verbindungsabbau-Modus übergehe, muss ich die zugehörigen Schritte in das Layout-Bedienfeld laden, aus der Funktion runspace

In meinem Skript habe ich drei Runspace (einen für GUI, einen für Funktion und eine für einen Timer).

Im GUI-Runspace ist PanelLabelInner (das Flowlayoutpanel) in einen PanelLabelOuter eingepackt. Dies ist für die vertikale Zentrierung. Ich muss die Beschriftungen in PanelLabelInner hinzufügen.

Ich muss BUiltXML-Funktion finalisieren. Löschen Sie zuerst alle Labels, wenn sich ein Modus ändert, und aktualisieren Sie dann die Benutzeroberfläche, um die neuen Labels anzuzeigen: Wie kann ich das tun?

Mit diesem Code nichts hinzugefügt wird, nehme ich, dass ich so etwas wie Update verwenden müssen, erfrischen ...

Gui Runspace:

$CommonHashTable.PanelLabelOuter=New-Object System.Windows.Forms.Panel 
$CommonHashTable.PanelLabelOuter.BackColor = [string]$PanelLabelOuterCfg.BackColor 
$CommonHashTable.PanelLabelOuter.Name ="PanelLabelOuter" 
$CommonHashTable.PanelLabelOuter.BorderStyle =[string]$PanelLabelOuterCfg.BorderStyle 
$CommonHashTable.PanelLabelOuter.Dock = "Fill" 
$CommonHashTable.PanelLabelOuter.AutoSize = $false 
$CommonHashTable.MiddleLayout.Controls.Add($CommonHashTable.PanelLabelOuter,2,0) 

$CommonHashTable.PanelLabelInner=New-Object System.Windows.Forms.FlowLayoutPanel 
$CommonHashTable.PanelLabelInner.AutoSize = $false 
$CommonHashTable.PanelLabelInner.Height = $CommonHashTable.c*20 
$CommonHashTable.PanelLabelInner.Left = [Int32]$PanelLabelInnerCfg.Left 
$CommonHashTable.PanelLabelInner.Width= $CommonHashTable.PanelLabelOuter.Width 
$top=[int32](($CommonHashTable.PanelLabelOuter.Size.Height - $CommonHashTable.PanelLabelInner.Size.Height)/2) 
$CommonHashTable.PanelLabelInner.Top=$top 
$CommonHashTable.PanelLabelInner.Padding= 0 
$CommonHashTable.PanelLabelInner.Anchor = 'None' 
$CommonHashTable.PanelLabelInner.FlowDirection = "TopDown" 
$CommonHashTable.PanelLabelInner.WrapContents = $false 
$CommonHashTable.PanelLabelInner.BackColor = [string]$PanelLabelInnerCfg.BackColor 
$CommonHashTable.PanelLabelInner.Name ="PanelLabelInner" 
$CommonHashTable.PanelLabelOuter.Controls.Add($CommonHashTable.PanelLabelInner) 

Funktion Runspace

function BuiltXML{ 
     Switch ($CommonHashTable.Phase) { 
        {$CommonHashTable.Phase -eq "Connect"} 
         { 
           $ConnectLabelText = "Connection" 
           $CommonHashTable.sourceXML = [xml](Get-Content $ProductPath\Xml\ConnectionLabels.xml) 

         } 

        {$CommonHashTable.Phase -eq "Disconnect"} 
         { 
           $ConnectLabelText = "Logout" 
           $CommonHashTable.sourceXML = [xml](Get-Content $ProductPath\Xml\DeconnectionLabels.xml) 
         } 
     } 
     $CommonHashTable.steps= $CommonHashTable.sourceXML.Dialer.Steps.Stp 
     $CommonHashTable.c = $CommonHashTable.steps.count 
     $CommonHashTable.PanelLabelInner.Invoke([Action[string]] { 
      $i =1 
       #$CommonHashTable.PanelLabelInner.Controls.Remove($CommonHashTable.Lbl) 
       $CommonHashTable.Lbl.Controls.Clear() 
       foreach ($e in $CommonHashTable.steps) 
       { 
        $CommonHashTable.Lbl = New-Object System.Windows.Forms.Label 
        $CommonHashTable.Lbl.Size=New-Object System.Drawing.Size($CommonHashTable.PanelLabelInner.Size.Width,20) 
        $CommonHashTable.Lbl.AutoSize = $false 
        $CommonHashTable.Lbl.Name = "Label"+$i 
        $CommonHashTable.Lbl.TextAlign = "MiddleLeft" 
        $CommonHashTable.Lbl.Text = $e.Label 
        $CommonHashTable.PanelLabelInner.Controls.Add($CommonHashTable.Lbl) 
        $i++ 
       } 
      }, 
     'normal') 
} 
+0

'Invoke ([Action [string]] {' -> 'Invoke ([Action [string]] [Script] :: Create {' – PetSerAl

+0

Danke, aber könnten Sie mir geben ein vollständigeres Beispiel? – mrplume

+0

Nicht sicher, wie ich mehr komplettes Beispiel zur Verfügung stellen sollte. Derzeit sehe ich einen Fehler in Ihrem Code: [nicht richtig Cross-Runspace-Aufruf] (http://stackoverflow.com/a/34691632). Mai-Vorschlag sollte es beheben. – PetSerAl

Antwort

0

I‘ Ich habe eine Lösung gefunden ... die Funktion hat auch das Flowlayout-Panel in Bezug auf die Anzahl der Etiketten aufgebaut. So habe ich ein Flowlayout Panel mit der guten Höhe. Ich muss nur das äußere Panel löschen, wenn ich umschalten muss, diese Labels hinzufügen und dann ein Update machen.

function BuiltXML{ 
    Switch ($CommonHashTable.Phase) { 
       {$CommonHashTable.Phase -eq "Connect"} 
        { 
          $CommonHashTable.ConnectLabel.Text = "Connexion" 
          $sourceXML = [xml](Get-Content $ProductPath\Xml\ConnectionLabels.xml) 

        } 

       {$CommonHashTable.Phase -eq "Disconnect"} 
        { 
          $CommonHashTable.ConnectLabel.Text = "Deconnexion" 
          $sourceXML = [xml](Get-Content $ProductPath\Xml\DeconnectionLabels.xml) 
        } 
    } 

    $etapes = $sourceXML.Dialer.Etapes.Etape 
    $c = $etapes.count 

    $CommonHashTable.PanelLabelOuter.Invoke(

    [Action] { 
     $CommonHashTable.PanelLabelOuter.Controls.Clear() 
      $CommonHashTable.PanelLabelInner=New-Object System.Windows.Forms.FlowLayoutPanel 
      $CommonHashTable.PanelLabelInner.AutoSize = $false 
      $CommonHashTable.PanelLabelInner.Height = $c*20 
      $CommonHashTable.PanelLabelInner.Left = [Int32]$PanelLabelInnerCfg.Left 
      $CommonHashTable.PanelLabelInner.Width= $CommonHashTable.PanelLabelOuter.Width 
      $top=[int32](($CommonHashTable.PanelLabelOuter.Size.Height - $CommonHashTable.PanelLabelInner.Size.Height)/2) 
      $CommonHashTable.PanelLabelInner.Top=$top 
      $CommonHashTable.PanelLabelInner.Padding= 0 
      $CommonHashTable.PanelLabelInner.Anchor = 'None' 
      $CommonHashTable.PanelLabelInner.FlowDirection = "TopDown" 
      $CommonHashTable.PanelLabelInner.WrapContents = $false 
      $CommonHashTable.PanelLabelInner.BackColor = [string]$PanelLabelInnerCfg.BackColor 
      $CommonHashTable.PanelLabelInner.Name ="PanelLabelInner" 
      $CommonHashTable.PanelLabelOuter.Controls.Add($CommonHashTable.PanelLabelInner) 

      $i =1 
      foreach ($e in $etapes) 
      { 
       $CommonHashTable.Lbl = New-Object System.Windows.Forms.Label 
       $CommonHashTable.Lbl.Size=New-Object System.Drawing.Size($CommonHashTable.PanelLabelInner.Size.Width,20) 
       $CommonHashTable.Lbl.AutoSize = $false 
       $CommonHashTable.Lbl.Name = "Label"+$i 
       $CommonHashTable.Lbl.TextAlign = "MiddleLeft" 
       #$CommonHashTable.Lbl.Font = New-Object System.Drawing.Font([string]$lblCfg.Font,[int32]$lblCfg.Size,[System.Drawing.FontStyle]::[string]$lblCfg.Style) 
       #$CommonHashTable.Lbl.ForeColor = [string]$lblCfg.Color 
       $CommonHashTable.Lbl.Text = $e.Label 
       $CommonHashTable.PanelLabelInner.Controls.Add($CommonHashTable.Lbl) 
       $i++ 
      } 
       $CommonHashTable.PanelLabelInner.update() 
     } 
    ) 

}

Verwandte Themen