У меня есть странная ошибка в PowerShell, поэтому каждый раз, когда я пытаюсь запустить свой скрипт, все работает, кроме моих кнопок. Чтобы лучше понять мой сценарий, я просто объясню его на кнопке выхода.
Add-Type -assembly System.Windows.Forms
$main_form = New-Object System.Windows.Forms.Form
$main_form.FormBorderStyle = 0
$main_form.Text ='**'
$main_form.Width = 1080
$main_form.Height = 720
$main_form.BackColor = "#101010"
$main_form.AutoSize = $true
$btnClose = New-Object System.Windows.Forms.Button
$btnClose.Name = "Close"
$btnClose.Text = "X"
$btnClose.TextAlign = "MiddleCenter"
$btnClose.Font = New-Object System.Drawing.Font("Segoe UI Semibold", 10, [System.Drawing.FontStyle]::Regular)
$btnClose.FlatStyle = [System.Windows.Forms.FlatStyle]::Flat
$btnClose.FlatAppearance.BorderSize = 0
$btnClose.BackColor = '#101010'
$btnClose.foreColor = '#FFFFFF'
$btnClose.Size = New-Object System.Drawing.Size(100,30)
$btnClose.Location = New-Object System.Drawing.Point(1020, 30)
$btnClose.Add_Click($btnClose_Close)
$main_form.Controls.Add($btnClose)
$btnClose_Close = {
$main_form.Close()
}
$main_form.ShowDialog()
Я думаю, что это прямо вперед, что делает кнопка, она просто закрывает форму. Теперь более точное объяснение: если я впервые запускаю код в Visual Studio Code или в Windows PowerShell ISE, кнопка сначала не будет работать, после того, как я ее закрою и снова запущу, она волшебным образом сработает. И проблема в том, что было бы хорошо, если бы скрипт работал без какой-либо IDE, но из-за этой ошибки кнопка не будет работать, когда она запускается как «обычный скрипт PowerShell» (щелкните левой кнопкой мыши «запустить с PowerShell» в Windows).
Заранее спасибо и извините за мой плохой английский.
Я предполагаю, что это проблема IDE (Visual Studio Code), но когда я увидел, что он не будет работать и в Windows PowerShell ISE, я поискал в Интернете, но похоже, что ни у кого нет этой проблемы.
привет, я добавил создание формы и протестировал ее, все еще есть такая же "ошибка"
Я не могу это объяснить, но если вы добавите свой сценарий в обработчик событий, он, похоже, будет работать нормально: $btnClose.Add_Click( { $main_form.Close() } )
. Зная, насколько суетлив WinForms с потоком пользовательского интерфейса, это, вероятно, связано с этим, но я недостаточно знаю о его нюансах, чтобы действительно объяснить. Обратите внимание, что если вы действительно заинтересованы в отдельном объявлении блока сценария, вы также можете вызвать его внутри вложенного блока сценария из обработчика событий, подобного этому $btnClose.Add_Click( { $btnClose_Close.Invoke() } )
, и это, похоже, тоже работает...
Проблема в том, что вы пытаетесь назначить блок скрипта событию щелчка до того, как вы определили блок скрипта. Вот почему бег два раза подряд работает. При втором запуске (в среде IDE или ISE) переменная блока сценария уже содержит значение из первого запуска, которое затем копируется в событие щелчка. Либо переместите объявление блока скрипта выше строки, которая назначает блок скрипта событию щелчка, либо сделайте это в строке, как предложил @mclayton.
Проблема в том, что вы пытаетесь назначить блок кода событию нажатия кнопки до того, как определите блок кода.
Просто переместите блок кода события клика на позицию выше, где вы назначаете событие клика. Например:
$btnClose_Close = {
$main_form.Close()
}
$btnClose.Add_Click($btnClose_Close)
$main_form.Controls.Add($btnClose)
Конечно, вы могли бы так же легко добавить встроенный код следующим образом:
$btnClose.Add_Click({$main_form.Close()})
$main_form.Controls.Add($btnClose)
Если вам интересно, почему исходный код работал при втором запуске при выполнении из среды разработки, вот объяснение:
Когда ваш код выполняется в первый раз, он присваивает пустую переменную $btnClose_Close
событию нажатия вашей кнопки. После этого он устанавливает желаемое значение $btnClose_Close
. В этот момент кнопка не будет работать на форме. Затем, когда вы повторно запускаете скрипт, переменная $btnClose_Close
по-прежнему сохраняет свое значение из предыдущего запуска. Итак, теперь, когда вы назначаете эту переменную событию щелчка, добавляется блок скрипта.
Можете ли вы добавить достаточно кода инициализации (например, как вы создаете форму), чтобы ваш образец можно было вырезать и вставлять как автономный сценарий, чтобы попытаться воспроизвести проблему локально (и, пожалуйста, проверьте, действительно ли ваш образец воспроизводит проблему) . Там могут быть строки кода, которые влияют на поведение без вашего ведома, и мы не сможем их угадать…