Блок сценариев события нажатия кнопки PowerShell не работает

#powershell #user-interface

#powershell #пользовательский интерфейс

Вопрос:

Я работаю над графическим интерфейсом с несколькими TabPage s. Внутри каждого TabPage есть несколько кнопок, которые должны «делать» s.th .

Итак, я определил $..OnClick={..} , что в этом примере write s.th . — но это не работает. Пожалуйста, что не так?

Вот полный пример, который показывает кнопку Check 1 в диалоговом окне, но кнопка вообще не работает:

 function guibutton ($window,$todo,[string]$name="Butty",[string]$text="Butty",
                    [int]$x=300,[int]$y=200,[int]$w=75,[int]$h=23) {
  $Button = New-Object System.Windows.Forms.Button
  $Button.Location = New-Object System.Drawing.Size($x,$y)
  $Button.Size = New-Object System.Drawing.Size($w,$h)
  $Button.Name = $name
  $Button.Text = $text
  $Button.Add_Click( { $todo } )
  $window.Controls.Add($Button)
}


#Generated Form Function
function GenerateForm {

  #region Import the Assemblies
  [reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null
  [reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null

  #region Generated Form Objects
  $MainMenu = New-Object System.Windows.Forms.Form
  $InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState

  #Buttons
  $TestTabA = New-Object System.Windows.Forms.Button
  $EXIT = New-Object System.Windows.Forms.Button
  $TabControl = New-Object System.Windows.Forms.TabControl

  #Misc Items
  $ProgressBar = New-Object System.Windows.Forms.ProgressBar
  $StatusBar = New-Object System.Windows.Forms.StatusBar

  #Tabs
  $TabControl = New-object System.Windows.Forms.TabControl
  $TabTestA = New-Object System.Windows.Forms.TabPage

  #----------------------------------------------
  #Generated Event Script Blocks
  #----------------------------------------------
  #Provide Custom Code for events specified in PrimalForms.
  #Unknown
  $handler_MainMenu_Load =
  $OnLoadForm_StateCorrection= { $MainMenu.WindowState = $InitialFormWindowState }

  #Buttons
  $TestTabA_OnClick = { $TabControl.SelectTab($TabTestA) }
  $EXIT_OnClick={
     Write-Host "Bye-Bye"
     $MainMenu.close()
  }

  $System_Drawing_Size = New-Object System.Drawing.Size
  $System_Drawing_Size.Height = 474
  $System_Drawing_Size.Width = 665

  $MainMenu.Font = New-Object System.Drawing.Font("Mistral",8.25,0,3,0) # Schriftart festlegen
  $MainMenu.ClientSize = $System_Drawing_Size
  $MainMenu.DataBindings.DefaultDataSourceUpdateMode = 0
  $MainMenu.Name = "MainMenu"
  $MainMenu.Text = "Test GUI"
  $MainMenu.TopMost = $True
  $MainMenu.add_Load($handler_form1_Load)

  # == FIX-Trade Button == #
  $TestTabA.Name = "TestTabA"
  $TestTabA.Text = "Test TabA"
  $TestTabA.TabIndex = 2
  $TestTabA.UseVisualStyleBackColor = $True
  $TestTabA.add_Click($TestTabA_OnClick)
  $TestTabA.DataBindings.DefaultDataSourceUpdateMode = 0
  $System_Drawing_Point = New-Object System.Drawing.Point
  $System_Drawing_Point.X = 12
  $System_Drawing_Point.Y = 69
  $TestTabA.Location = $System_Drawing_Point
  $System_Drawing_Size = New-Object System.Drawing.Size
  $System_Drawing_Size.Height = 35
  $System_Drawing_Size.Width = 100
  $TestTabA.Size = $System_Drawing_Size
  $MainMenu.Controls.Add($TestTabA)


  # == EXIT all Button == #
  $EXIT.Name = "EXIT"
  $EXIT.Text = "EXIT"
  $EXIT.TabIndex = 7
  $EXIT.UseVisualStyleBackColor = $True
  $EXIT.add_Click($EXIT_OnClick)
  $EXIT.DataBindings.DefaultDataSourceUpdateMode = 0
  $System_Drawing_Point = New-Object System.Drawing.Point
  $System_Drawing_Point.X = 12
  $System_Drawing_Point.Y = 274
  $EXIT.Location = $System_Drawing_Point
  $System_Drawing_Size = New-Object System.Drawing.Size
  $System_Drawing_Size.Height = 35
  $System_Drawing_Size.Width = 100
  $EXIT.Size = $System_Drawing_Size

  $MainMenu.Controls.Add($EXIT)

  # == Tab Control == #
  $TabControl.Name = "TabControl"
  $TabControl.TabIndex = 4
  $TabControl.SelectedIndex = 0
  $TabControl.DataBindings.DefaultDataSourceUpdateMode = 0
  $System_Drawing_Point = New-Object System.Drawing.Point
  $System_Drawing_Point.X = 118
  $System_Drawing_Point.Y = 70
  $TabControl.Location = $System_Drawing_Point
  $System_Drawing_Size = New-Object System.Drawing.Size
  $System_Drawing_Size.Height = 374
  $System_Drawing_Size.Width = 535
  $TabControl.Size = $System_Drawing_Size

  # Add the following to the TabControl property-setting section:

  $TabSizeMode = New-object System.Windows.Forms.TabSizeMode
  $TabSizeMode = "Fixed"
  $TabControl.SizeMode =$TabSizeMode
  $TabControl.ItemSize = New-Object System.Drawing.Size(0, 1)
  $TabAppearance = New-object System.Windows.Forms.TabAppearance
  $TabAppearance = "Buttons"
  $TabControl.Appearance = $TabAppearance
  $MainMenu.Controls.Add($TabControl)


  $Check1Button_OnClick  = { Write-Host "Check1-Click, mach was.. " }
  # == Trade Tab == #
  $TabTestA.DataBindings.DefaultDataSourceUpdateMode = 0
  $TabTestA.Name = "TestTabA"
  $System_Drawing_Point = New-Object System.Drawing.Point
  $System_Drawing_Point.X = 4
  $System_Drawing_Point.Y = 22
  $TabTestA.Location = $System_Drawing_Point
  $System_Drawing_Size = New-Object System.Drawing.Size
  $System_Drawing_Size.Height = 205
  $System_Drawing_Size.Width = 445
  $TabTestA.Size = $System_Drawing_Size
  $TabTestA.TabIndex = 2
  $TabTestA.Text = "Tab2"
  $TabTestA.UseVisualStyleBackColor = $True

  #                         name     Txt        x   y    w  h
  guibutton $TabTestA $Check1Button_OnClick "Check1"   "Check 1"    10  20  75 23
  $TabControl.Controls.Add($TabTestA)

  # == Progress Bar == #
  $progressBar.DataBindings.DefaultDataSourceUpdateMode = 0
  $System_Drawing_Point = New-Object System.Drawing.Point
  $System_Drawing_Point.X = 589
  $System_Drawing_Point.Y = 458
  $progressBar.Location = $System_Drawing_Point
  $progressBar.Name = "progressBar"
  $System_Drawing_Size = New-Object System.Drawing.Size
  $System_Drawing_Size.Height = 15
  $System_Drawing_Size.Width = 75
  $progressBar.Size = $System_Drawing_Size
  $progressBar.TabIndex = 0

  $MainMenu.Controls.Add($progressBar)

  # == Status bar == #
  $StatusBar.DataBindings.DefaultDataSourceUpdateMode = 0
  $System_Drawing_Point = New-Object System.Drawing.Point
  $System_Drawing_Point.X = 0
  $System_Drawing_Point.Y = 456
  $StatusBar.Location = $System_Drawing_Point
  $StatusBar.Name = "StatusBar"
  $System_Drawing_Size = New-Object System.Drawing.Size
  $System_Drawing_Size.Height = 18
  $System_Drawing_Size.Width = 665
  $StatusBar.Size = $System_Drawing_Size
  $StatusBar.TabIndex = 1
  $StatusBar.Text = "statusBar - Text..."
  $StatusBar.add_PanelClick($statusBar_PanelClick)

  $MainMenu.Controls.Add($StatusBar)

  #To show that the tabs are switching correctly, you could add:
  $TabTestA.BackColor = "White"

  # == Save and Open Form == #
  $InitialFormWindowState = $MainMenu.WindowState
  $MainMenu.add_Load($OnLoadForm_StateCorrection)
  $MainMenu.ShowDialog()| Out-Null

} #End Function

#Call the Function
GenerateForm
  

Если я запускаю графический интерфейс, появляется диалоговое окно, но если я нажму на кнопку, которая write-host ".." ничего не должна произойти: (

Комментарии:

1. Что такое s.th .? Является ли это абсолютным минимальным примером, демонстрирующим вашу проблему?

2. Больше кода помогло бы…

3. Пожалуйста, вот оно, это работает, попробуйте нажать кнопку проверки 1. Я ожидаю, что на консоли будет написано «Check1-Click, mach был …», но ничего не происходит : (

4. @alroc Это твой способ сказать tl; dr;? 🙂

Ответ №1:

Вы переносите переданный в scriptblock в другой scriptblock. Измените эту строку:

 $Button.Add_Click({$todo})
  

Для

 $Button.Add_Click($todo)
  

Вы также можете указать тип $todo как блок сценариев.

 function guibutton($window,[scriptblock]$todo,[string]$name="Butty",[string]$text="Butty", ...
  

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

Комментарии:

1. qKeith Hill: Большое вам спасибо. Вначале я дал меньше кода, но двое других сказали предоставить больше кода, поэтому я создал рабочий скрипт .. Но большое спасибо !!, Gooly