Как добавить метку из другого пространства выполнения в графический интерфейс Powershell?

В моем графическом интерфейсе Powershell у меня есть два режима: подключение и отключение. Для каждого есть список шагов. Этот список считывается из xml, а затем загружается в панель потока в качестве метки для каждого шага. Итак, если у меня есть 8 шагов для подключения, у меня будет 8 меток, созданных на панели flowlayout.

Я хочу динамически менять метки при изменении моего режима. Если я нахожусь в режиме подключения и перехожу в режим отключения, мне нужно загрузить соответствующие шаги на панели flowlayout из пространства выполнения функции

В моем скрипте есть три пространства выполнения (одно для графического интерфейса, одно для функции и одно для таймера).

В среде выполнения графического интерфейса PanelLabelInner (панель потока) заключена в PanelLabelOuter. Это для вертикального центрирования. Мне нужно добавить метки в PanelLabelInner.

Мне нужно доработать функцию BUiltXML. Сначала удалите все метки при изменении режима, а затем обновите пользовательский интерфейс, чтобы отобразить новые метки: как я могу это сделать?

С этим кодом ничего не добавляется, я полагаю, я должен использовать что-то вроде обновления, обновления...

Графический интерфейс:

$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)

Пространство выполнения функций

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')
}

person mrplume    schedule 21.07.2016    source источник
comment
Спасибо, но не могли бы вы дать мне более полный образец?   -  person mrplume    schedule 21.07.2016
comment
Не уверен, как мне предоставить более полный образец. В настоящее время я вижу одну ошибку в вашем коде: неправильный перекрестный вызов Runspace. Майское предложение должно исправить это.   -  person user4003407    schedule 23.07.2016


Ответы (1)


Я нашел решение... функция также построила панель потока в зависимости от количества меток. Итак, у меня есть панель Flowlayout с хорошей высотой. Мне нужно только очистить внешнюю панель, когда мне нужно переключиться, добавить эти метки, а затем выполнить обновление.

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()
        } 
    )

}

person mrplume    schedule 26.07.2016