在TabControl中选择标签页而不会窃取焦点

使用TabControl.SelectTab("...")显示选项卡,但它也提供选项卡焦点。 我想展示一个特定的标签,但要保持焦点。

我在网格中有数据行。 根据所选行的属性,我显示了一个不同的标签页,以具有不同的UI布局。 但是当使用箭头键滚动行时,焦点会切换到选定的选项卡 – 我不想发生这种情况。

谢谢。

我认为没有内置函数,但您可以这样做:

 private bool skipSelectionChanged = false; private void dataGridView_SelectionChanged(object sender, EventArgs e) { if (skipSelectionChanged) return; // supposing we decide tab[0] has to be selected... this.SelectTabWithoutFocus(this.tabControl1.TabPages[0]); } private void SelectTabWithoutFocus(TabPage tabPage) { this.skipSelectionChanged = true; // "this" is the form in my case, so you get the current focused control // (ActiveControl), backup it, and re-set it after Tab activation var prevFocusedControl = this.ActiveControl; if (this.ActiveControl != null) { this.tabControl1.SelectedTab = tabPage; prevFocusedControl.Focus(); } this.skipSelectionChanged = false; } 

在这里,我备份当前的聚焦控件,选择所需的选项卡,最后将焦点设置为原始控件。

跳过布尔值是必要的,因为将焦点放到网格上会再次触发SelectionChanged事件,从而导致无限循环。

您可以在设置所选选项卡之前尝试禁用TabControl ,然后重新启用它。 这将防止它成为焦点。 我在一个标签控件上测试了它,上面有一些控件,并没有看到任何视觉上的变化,但你必须在你的UI中尝试它,看看它是否适合你。

 tabControl1.Enabled = false; tabControl1.SelectTab("tabPage4"); tabControl1.Enabled = true; 

为了安全起见,您可以将该行重新启用finally块中的TabControl,以确保它不会被禁用。

这会选择标签页,同时将焦点保持在顶部,如上所述:

  tc.TabPages[0].Enabled = false; tc.SelectTab(0); tc.TabPages[0].Enabled = true; 

tc在这里是TabControl类型的实例(即它是我的选项卡控件,它有一些“标签页”)。 这适合我。 我的目的是使用向左和向右键(arrows)循环浏览这些标签页,即当我前进(通过Key.Right )并到达最后一个tabpage我希望将焦点放在[0]而不激活DataGridView我在那个页面中,当我向后(通过Key.Left )并到达[0]我希望启用[tc.TabCount – 1] ,这是最后一个。 这种情况的代码是:

  tc.TabPages[tc.TabCount - 1].Enabled = false; tc.SelectTab(tc.TabCount - 1); tc.TabPages[tc.TabCount - 1].Enabled = true; 

完整的代码是:

  private bool KeyTc(System.Windows.Forms.Keys keyData) { if (keyData == K.Left && tc.SelectedIndex == 0) { tc.TabPages[tc.TabCount - 1].Enabled = false; tc.SelectTab(tc.TabCount - 1); tc.TabPages[tc.TabCount - 1].Enabled = true; return true; } else if (keyData == K.Right && tc.SelectedIndex == tc.TabCount - 1) { tc.TabPages[0].Enabled = false; tc.SelectTab(0); tc.TabPages[0].Enabled = true; return true; } return false; } 

这个bool KeyTc返回到switch语句中的一个案例,用于以下方面的密钥评估:

 protected override bool ProcessCmdKey(ref Message keyMsg, Keys keyData) { switch keyData { ... } } 

基于“Jeff Ogata提出的解决方案:您可以尝试在设置选定的选项卡之前禁用TabControl,然后重新启用它。这将阻止它获得焦点”,这是我的解决方案:

 tabMain.SelectedPageChanging += (s, e) => { tabMain.Enabled = false; }; tabMain.SelectedPageChanged += (s, e) => { tabMain.Enabled = true; }; 

注意:此代码使用DevExpress“DevExpress.XtraTab.XtraTabControl”。