Кнопки Powershell работают только на втором «запустить и отладить»

У меня есть странная ошибка в 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, я поискал в Интернете, но похоже, что ни у кого нет этой проблемы.

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

mclayton 05.04.2023 10:16

привет, я добавил создание формы и протестировал ее, все еще есть такая же "ошибка"

SirWinstonChurchillTheFirst 05.04.2023 10:56

Я не могу это объяснить, но если вы добавите свой сценарий в обработчик событий, он, похоже, будет работать нормально: $btnClose.Add_Click( { $main_form.Close() } ). Зная, насколько суетлив WinForms с потоком пользовательского интерфейса, это, вероятно, связано с этим, но я недостаточно знаю о его нюансах, чтобы действительно объяснить. Обратите внимание, что если вы действительно заинтересованы в отдельном объявлении блока сценария, вы также можете вызвать его внутри вложенного блока сценария из обработчика событий, подобного этому $btnClose.Add_Click( { $btnClose_Close.Invoke() } ), и это, похоже, тоже работает...

mclayton 05.04.2023 11:52

Проблема в том, что вы пытаетесь назначить блок скрипта событию щелчка до того, как вы определили блок скрипта. Вот почему бег два раза подряд работает. При втором запуске (в среде IDE или ISE) переменная блока сценария уже содержит значение из первого запуска, которое затем копируется в событие щелчка. Либо переместите объявление блока скрипта выше строки, которая назначает блок скрипта событию щелчка, либо сделайте это в строке, как предложил @mclayton.

emanresu 05.04.2023 21:43
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Просто переместите блок кода события клика на позицию выше, где вы назначаете событие клика. Например:

$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 по-прежнему сохраняет свое значение из предыдущего запуска. Итак, теперь, когда вы назначаете эту переменную событию щелчка, добавляется блок скрипта.

Другие вопросы по теме