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

时间:2010-10-28 15:57:30

标签: c# .net winforms

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

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

感谢。

4 个答案:

答案 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”。