Кнопка действует так, как будто я нажимаю ее несколько раз по экспоненте - PullRequest
0 голосов
/ 05 февраля 2020

Относительно новый для PowerShell. Может встретиться с плохой практикой

У меня странная проблема с формами и кнопками PS. Я создал небольшую GUI программу, которая гарантирует, что я установил все соответствующие программы перед отправкой компьютера из офиса.

В этой программе у меня есть раздел, в котором будет отображаться информационная форма. В этой форме будет описана программа, к кому обращаться по вопросам, et c. В этой форме у меня есть кнопка, которая выдает список серийных номеров, которые мне понадобятся для каждой программы. Текст в информационной форме заменяется соответствующей последовательной информацией. Внизу у меня есть кнопка «Назад», чтобы вернуться к исходной форме информации. Если я нажму эту кнопку, форма вернется в прежнее состояние. Что именно то, что я хочу. Но допустим, я хочу go вернуться в раздел S / N. Я нажму кнопку S / N и, конечно же, она снова приведет меня в раздел S / N. Замечательно! Но теперь, когда я нажимаю эту кнопку назад, форма быстро переключается между двумя различными текстами. Это все равно заканчивается тем, что возвращает меня обратно, но когда я go снова попадаю в секцию S / N, затем продолжаю нажимать снова, на этот раз он переключится между двумя различными текстами на еще более длительный период времени. Я мог бы проделать этот же процесс весь день, и переключение текста вперед увеличится в геометрической прогрессии. Это сводит меня с ума. Вот мой код:

$Info_Form = New-Object system.Windows.Forms.Form
$Info_Form.Text = "Information"
$Info_Form.AutoScroll = $True
$Info_Form.AutoSize = $True 
$Info_Form.MinimizeBox = $False
$Info_Form.MaximizeBox = $False
$Info_Form.ShowInTaskbar = $True
$Info_Form.StartPosition = "CenterScreen"
$Info_Label = New-Object System.Windows.Forms.Label
$Info_Label.Location = New-Object System.Drawing.Size(10,10)
$Info_Label.AutoSize = $True
$SN_Btn = New-Object System.Windows.Forms.Button
$SN_Btn.Size = New-Object -TypeName System.Drawing.Size(75,23)
$SN_Btn.Location = New-Object -TypeName System.Drawing.Size(120,200)



function snForm {
    $Info_Label.Text = "S/N Info Goes Here."
    $SN_Btn.Text = "Back"
    $SN_Btn.Add_Click({
        infoForm
    })
    $Info_Form.Refresh()
}
function infoForm {
    $Info_Label.Text = "Program Info Goes Here"
    $SN_Btn.Text = "S/N's"
    $SN_Btn.Add_Click({
        snForm
    })
    if ($Info_Form.IsHandleCreated){
        $Info_Form.Refresh()
    } else {
        $Info_Form.Controls.Add($SN_Btn)
        $Info_Form.Controls.Add($Info_Label)
        $Info_Form.ShowDialog()
    }

}
infoForm

Пожалуйста, дайте мне знать, что вы думаете. Если я поступаю неправильно, пожалуйста, помогите мне лучше. Спасибо за ваше время!

1 Ответ

1 голос
/ 06 февраля 2020

Основная проблема, с которой вы сталкиваетесь, заключается в том, что при каждом нажатии кнопки вы добавляете в нее еще один обработчик нажатия.

Я переписал его, используя хеш-таблицу для хранения различных состояний надписи и текста кнопки, чтобы вы могли переключаться между ними в одном событии щелчка. Теперь «имя» состояния сохраняется в свойстве тега кнопки (его можно сохранить в любом месте, но свойства тега удобны для хранения вещей.

$Info_Form = New-Object system.Windows.Forms.Form
$Info_Form.Text = "Information"
$Info_Form.AutoScroll = $True
$Info_Form.AutoSize = $True 
$Info_Form.MinimizeBox = $False
$Info_Form.MaximizeBox = $False
$Info_Form.ShowInTaskbar = $True
$Info_Form.StartPosition = "CenterScreen"
$Info_Label = New-Object System.Windows.Forms.Label
$Info_Label.Location = New-Object System.Drawing.Size(10,10)
$Info_Label.AutoSize = $True
$SN_Btn = New-Object System.Windows.Forms.Button
$SN_Btn.Size = New-Object -TypeName System.Drawing.Size(75,23)
$SN_Btn.Location = New-Object -TypeName System.Drawing.Size(120,200)

$content=@{Info=@{Label="Program Info Goes Here";Button="S/N's"}
           SN=@{Label="S/N Info Goes Here.";Button="Back"}
           }


function infoForm {
    $Info_Label.Text = "Program Info Goes Here"
    $SN_Btn.Text = "S/N's"
    $sn_Btn.Tag='Info'
    $SN_Btn.Add_Click({
        $newTag=$content.Keys| where {$_ -ne $sn_btn.Tag}
        $sn_Btn.Text=$content[$newTag].Button
        $info_label.Text=$content[$newTag].Label
        $sn_btn.Tag=$newTag
    })
    if ($Info_Form.IsHandleCreated){
        $Info_Form.Refresh()
    } else {
        $Info_Form.Controls.Add($SN_Btn)
        $Info_Form.Controls.Add($Info_Label)
        $Info_Form.ShowDialog()
    }

}
infoForm
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...