Невозможно переименовать кнопку на основе значения - PullRequest
0 голосов
/ 09 мая 2019

Если переменная равна 1, измените имена кнопок для сброса;иначе измените его на прежнее.Однако я не могу заставить его работать как следует.

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

Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Application]::EnableVisualStyles()

$Form                            = New-Object system.Windows.Forms.Form
$Form.ClientSize                 = '273,155'
$Form.text                       = "Rename_Test"
$Form.TopMost                    = $false

$BRename                         = New-Object system.Windows.Forms.Button
$BRename.text                    = "Rename"
$BRename.width                   = 182
$BRename.height                  = 88
$BRename.location                = New-Object System.Drawing.Point(39,26)
$BRename.Font                    = 'Microsoft Sans Serif,10'

$Form.controls.AddRange(@($BRename))

#Variables
$MyNumber = [int]1

Function AddNumber{
    $MyNumber = [int]$MyNumber + [int]1
    $BRename.text = "Reset"
}

Function SubNumber{
    $MyNumber = [int]$MyNumber - [int]1
    $BRename.text = "Rename"
}

Function GetNumber {
    $MyNumber
}

$BRename.Add_Click({

    if($MyNumber -eq [int]1){
        AddNumber
    }

    If($MyNumber -eq [int]2){
        SubNumber
    }

 })

 [void]$Form.ShowDialog()

Ответы [ 2 ]

2 голосов
/ 09 мая 2019

Причина - переменная область.Изменение переменной внутри функции по умолчанию не меняет ее в родительской области видимости.Таким образом,

Function SubNumber{
    $MyNumber = [int]$MyNumber - [int]1

изменит только $MyNumber внутри функции SubNumber, а исходная функция не изменится.Это довольно похоже на схему передачи по значению.В результате $MyNumber никогда не равно 2, и, следовательно, функция вычитания никогда не вызывается.

В качестве примечания, явное [int] не требуется и не типично для сценариев Powershell.

Чтобы изменить переменную в области видимости скрипта, используйте префикс $script: внутри функции.Вот так

Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Application]::EnableVisualStyles()

$Form                            = New-Object system.Windows.Forms.Form
$Form.ClientSize                 = '273,155'
$Form.text                       = "Rename_Test"
$Form.TopMost                    = $false

$BRename                         = New-Object system.Windows.Forms.Button
$BRename.text                    = "Rename"
$BRename.width                   = 182
$BRename.height                  = 88
$BRename.location                = New-Object System.Drawing.Point(39,26)
$BRename.Font                    = 'Microsoft Sans Serif,10'

$Form.controls.AddRange(@($BRename))

#Variables
$MyNumber = 1

function Renamed {
    switch ($script:MyNumber) { # Switch is usually better than multiple if statements
        1 { $BRename.text = "Reset"; ++$script:MyNumber }
        2 { $BRename.text = "Rename"; --$script:MyNumber }
        default  {$script:MyNumber = 1} # For unexpected values, force inital value
    }
}
$BRename.Add_Click({Renamed})

[void]$Form.ShowDialog()
0 голосов
/ 09 мая 2019

Смотрите комментарии в коде:

    Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Application]::EnableVisualStyles()


# Scriptblock for button pressed

$script:MyNumber = -1

$action = {
    $script:MyNumber = -$script:MyNumber
    if( $script:MyNumber -gt 0 ) {
        $BRename.text = "Reset"
    }
    else {
        $BRename.text = "Rename"
    }
}

$form                            = New-Object system.Windows.Forms.Form
$form.Visible                    = $false
[void]$form.SuspendLayout()

$form.ClientSize                 = '273,155'
$form.text                       = "Rename_Test"
$form.TopMost                    = $false

$BRename                         = New-Object system.Windows.Forms.Button
$BRename.text                    = "Rename"
$BRename.width                   = 182
$BRename.height                  = 88
$BRename.location                = New-Object System.Drawing.Point(39,26)
$BRename.Font                    = 'Microsoft Sans Serif,10'
$BRename.Add_Click( $action )    # event must asigned before showDialog!

$Form.controls.Add($BRename)

[void]$form.ResumeLayout()
$userInput = $form.ShowDialog()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...