如何实现PowerShell WinForms计算器无需重启即可重复输入计算?
解决PowerShell WinForms ABC Pattern Calculator重复输入计算的问题
你的问题核心是脚本执行单次计算后就终止会话或关闭窗口,只需调整WinForms的事件逻辑,让窗口持续运行,且计算按钮可重复触发、每次读取最新输入值即可实现同会话重复计算。
关键修改思路
- 用
ShowDialog()维持窗口模态运行,直到用户主动关闭 - 计算按钮的
Click事件每次触发时,重新读取输入框的当前值 - 加入输入合法性验证,避免非数字输入报错
- 可选添加输入框清空逻辑,方便重复输入
完整实现代码
Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Drawing # 创建主窗体 $mainForm = New-Object System.Windows.Forms.Form $mainForm.Text = "ABC Pattern Calculator" $mainForm.Size = New-Object System.Drawing.Size(400, 300) $mainForm.StartPosition = "CenterScreen" # 创建标签页容器 $tabControl = New-Object System.Windows.Forms.TabControl $tabControl.Dock = "Fill" # ---------------------- 看涨模式标签页 ---------------------- $bullishTab = New-Object System.Windows.Forms.TabPage("Bullish Pattern") # 输入控件 $labelA_Bull = New-Object System.Windows.Forms.Label $labelA_Bull.Text = "Point A:" $labelA_Bull.Location = New-Object System.Drawing.Point(20, 20) $inputA_Bull = New-Object System.Windows.Forms.TextBox $inputA_Bull.Location = New-Object System.Drawing.Point(100, 20) $inputA_Bull.Size = New-Object System.Drawing.Size(200, 20) $labelB_Bull = New-Object System.Windows.Forms.Label $labelB_Bull.Text = "Point B:" $labelB_Bull.Location = New-Object System.Drawing.Point(20, 60) $inputB_Bull = New-Object System.Windows.Forms.TextBox $inputB_Bull.Location = New-Object System.Drawing.Point(100, 60) $inputB_Bull.Size = New-Object System.Drawing.Size(200, 20) $labelC_Bull = New-Object System.Windows.Forms.Label $labelC_Bull.Text = "Point C:" $labelC_Bull.Location = New-Object System.Drawing.Point(20, 100) $inputC_Bull = New-Object System.Windows.Forms.TextBox $inputC_Bull.Location = New-Object System.Drawing.Point(100, 100) $inputC_Bull.Size = New-Object System.Drawing.Size(200, 20) # 计算按钮 $calcBtn_Bull = New-Object System.Windows.Forms.Button $calcBtn_Bull.Text = "Calculate Point D" $calcBtn_Bull.Location = New-Object System.Drawing.Point(20, 140) $calcBtn_Bull.Size = New-Object System.Drawing.Size(280, 30) # 结果显示 $resultLabel_Bull = New-Object System.Windows.Forms.Label $resultLabel_Bull.Text = "Point D:" $resultLabel_Bull.Location = New-Object System.Drawing.Point(20, 180) $resultLabel_Bull.AutoSize = $true # 看涨模式计算逻辑(替换为你的实际运算公式) $calcBtn_Bull.Add_Click({ if ([double]::TryParse($inputA_Bull.Text, [ref]$a) -and [double]::TryParse($inputB_Bull.Text, [ref]$b) -and [double]::TryParse($inputC_Bull.Text, [ref]$c)) { $d = $a + ($b - $c) * 1.618 # 示例公式,按需修改 $resultLabel_Bull.Text = "Point D: $($d.ToString('N4'))" # 可选:清空输入框方便下次输入 # $inputA_Bull.Text = "" # $inputB_Bull.Text = "" # $inputC_Bull.Text = "" } else { $resultLabel_Bull.Text = "Point D: 输入无效,请输入数字" } }) # 将控件添加到看涨标签页 $bullishTab.Controls.AddRange(@($labelA_Bull, $inputA_Bull, $labelB_Bull, $inputB_Bull, $labelC_Bull, $inputC_Bull, $calcBtn_Bull, $resultLabel_Bull)) # ---------------------- 看跌模式标签页 ---------------------- $bearishTab = New-Object System.Windows.Forms.TabPage("Bearish Pattern") # 输入控件 $labelA_Bear = New-Object System.Windows.Forms.Label $labelA_Bear.Text = "Point A:" $labelA_Bear.Location = New-Object System.Drawing.Point(20, 20) $inputA_Bear = New-Object System.Windows.Forms.TextBox $inputA_Bear.Location = New-Object System.Drawing.Point(100, 20) $inputA_Bear.Size = New-Object System.Drawing.Size(200, 20) $labelB_Bear = New-Object System.Windows.Forms.Label $labelB_Bear.Text = "Point B:" $labelB_Bear.Location = New-Object System.Drawing.Point(20, 60) $inputB_Bear = New-Object System.Windows.Forms.TextBox $inputB_Bear.Location = New-Object System.Drawing.Point(100, 60) $inputB_Bear.Size = New-Object System.Drawing.Size(200, 20) $labelC_Bear = New-Object System.Windows.Forms.Label $labelC_Bear.Text = "Point C:" $labelC_Bear.Location = New-Object System.Drawing.Point(20, 100) $inputC_Bear = New-Object System.Windows.Forms.TextBox $inputC_Bear.Location = New-Object System.Drawing.Point(100, 100) $inputC_Bear.Size = New-Object System.Drawing.Size(200, 20) # 计算按钮 $calcBtn_Bear = New-Object System.Windows.Forms.Button $calcBtn_Bear.Text = "Calculate Point D" $calcBtn_Bear.Location = New-Object System.Drawing.Point(20, 140) $calcBtn_Bear.Size = New-Object System.Drawing.Size(280, 30) # 结果显示 $resultLabel_Bear = New-Object System.Windows.Forms.Label $resultLabel_Bear.Text = "Point D:" $resultLabel_Bear.Location = New-Object System.Drawing.Point(20, 180) $resultLabel_Bear.AutoSize = $true # 看跌模式计算逻辑(替换为你的实际运算公式) $calcBtn_Bear.Add_Click({ if ([double]::TryParse($inputA_Bear.Text, [ref]$a) -and [double]::TryParse($inputB_Bear.Text, [ref]$b) -and [double]::TryParse($inputC_Bear.Text, [ref]$c)) { $d = $a - ($c - $b) * 1.618 # 示例公式,按需修改 $resultLabel_Bear.Text = "Point D: $($d.ToString('N4'))" # 可选:清空输入框方便下次输入 # $inputA_Bear.Text = "" # $inputB_Bear.Text = "" # $inputC_Bear.Text = "" } else { $resultLabel_Bear.Text = "Point D: 输入无效,请输入数字" } }) # 将控件添加到看跌标签页 $bearishTab.Controls.AddRange(@($labelA_Bear, $inputA_Bear, $labelB_Bear, $inputB_Bear, $labelC_Bear, $inputC_Bear, $calcBtn_Bear, $resultLabel_Bear)) # 组装窗体并运行 $tabControl.TabPages.AddRange(@($bullishTab, $bearishTab)) $mainForm.Controls.Add($tabControl) $mainForm.ShowDialog() | Out-Null
使用说明
- 替换代码中的看涨/看跌模式计算公式为你实际需要的算术逻辑
- 运行脚本后,窗口会保持打开状态,每次输入新数值后点击计算按钮即可得到结果
- 如需快速清空输入框,可取消注释代码中对应的清空语句
内容的提问来源于stack exchange,提问作者spaceibiza
相关产品推荐
相关产品推荐

