在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”。