使用TabControl.SelectTab("...")
显示标签,但它也会显示标签焦点。我想展示一个特定的标签,但要保持焦点。
我在网格中有数据行。根据所选行的属性,我显示了一个不同的标签页,以具有不同的UI布局。但是当使用箭头键滚动行时,焦点会切换到所选的选项卡 - 我不想发生这种情况。
感谢。
答案 0 :(得分:14)
您可以尝试在设置所选标签之前禁用TabControl
,然后重新启用它。这将防止它成为焦点。我在一个带有几个控件的标签控件上对此进行了测试,并没有看到任何视觉上的变化,但您必须在用户界面中尝试它并查看它是否适合您。
tabControl1.Enabled = false;
tabControl1.SelectTab("tabPage4");
tabControl1.Enabled = true;
为了安全起见,您可以将该行重新启用finally块中的TabControl,以确保它不会被禁用。
答案 1 :(得分:3)
我认为没有内置功能,但您可以这样做:
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
事件,从而导致无限循环。
答案 2 :(得分:1)
这会选择标签页,同时将焦点保持在最顶层,如上所述:
tc.TabPages[0].Enabled = false;
tc.SelectTab(0);
tc.TabPages[0].Enabled = true;
tc在这里是 TabControl 类型的实例(即它是我的标签控件,它有一些"标签页")。这适合我。我的目的是使用左右键(arrows)
i遍历这些标签页。即当我前进(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 { ... } }
答案 3 :(得分:0)
基于“Jeff Ogata提出的解决方案:您可以尝试在设置选定的选项卡之前禁用TabControl,然后重新启用它。这将阻止它关注焦点”,这是我的解决方案:
tabMain.SelectedPageChanging += (s, e) =>
{
tabMain.Enabled = false;
};
tabMain.SelectedPageChanged += (s, e) =>
{
tabMain.Enabled = true;
};
注意:此代码使用的是DevExpress“DevExpress.XtraTab.XtraTabControl”。