System.Windows.Forms.TabPage的add_LostFocus与add_GotFocus失效问题
问题分析与解决方法
你的问题出在错误绑定了TabPage的焦点事件:Windows Forms中,切换TabControl的标签页时,TabPage的GotFocus和LostFocus事件并不会触发——因为焦点实际属于TabControl或其内部的子控件,而非TabPage本身,所以这两个事件永远不会被调用,导致按钮状态始终不变。
正确的做法是监听TabControl的SelectedIndexChanged事件,通过判断当前选中的标签页来控制按钮的显示/隐藏:
修改后的完整代码
$form = New-Object system.Windows.Forms.Form $form.ClientSize = New-Object System.Drawing.Point(350,380) $form.text = "Form" $tabcontrol = New-object System.Windows.Forms.TabControl $tabcontrol.Size = New-Object System.Drawing.Size(330,330) $tabcontrol.Location = New-Object System.Drawing.Point(10,10) $form.Controls.Add($tabcontrol) $tab0 = New-object System.Windows.Forms.Tabpage $tab0.DataBindings.DefaultDataSourceUpdateMode = 0 $tab0.UseVisualStyleBackColor = $True $tab0.Text = "Tab0" $tab0.AutoScroll = $true $tabcontrol.Controls.Add($tab0) $add_button = New-Object System.Windows.Forms.Button $add_button.Size = New-Object System.Drawing.Size(23,23) $add_button.Location = New-Object System.Drawing.Point(10,350) $add_button.Text = "+" $form.Controls.Add($add_button) $remove_button = New-Object System.Windows.Forms.Button $remove_button.Size = New-Object System.Drawing.Size(23,23) $remove_button.Location = New-Object System.Drawing.Point(43,350) $remove_button.Text = "-" $form.Controls.Add($remove_button) # 初始状态:默认选中Tab0,显示按钮;如果默认不是Tab0则隐藏 if ($tabcontrol.SelectedIndex -eq 0) { $add_button.Show() $remove_button.Show() } else { $add_button.Hide() $remove_button.Hide() } # 监听TabControl的选中项变化事件 $tabcontrol.add_SelectedIndexChanged({ if ($tabcontrol.SelectedTab -eq $tab0) { $add_button.Show() $remove_button.Show() } else { $add_button.Hide() $remove_button.Hide() } }) $tab1 = New-object System.Windows.Forms.Tabpage $tab1.DataBindings.DefaultDataSourceUpdateMode = 0 $tab1.UseVisualStyleBackColor = $True $tab1.Text = "Tab1" $tabcontrol.Controls.Add($tab1) # 显示窗体(原代码遗漏了这行,否则窗体不会弹出) $form.ShowDialog() | Out-Null
关键修改说明
- 移除了
$tab0的GotFocus和LostFocus事件绑定 - 添加
tabcontrol的SelectedIndexChanged事件处理逻辑,通过SelectedTab判断当前选中的是否是$tab0,以此控制按钮的显示状态 - 增加了初始状态判断,确保窗体启动时按钮状态符合预期
- 补充了
$form.ShowDialog(),否则窗体无法正常显示
内容的提问来源于stack exchange,提问作者jerdub1993
相关产品推荐
相关产品推荐

