簡體   English   中英

在TabControl中選擇標簽頁而不會竊取焦點

[英]Select Tab Page in TabControl without stealing focus

使用TabControl.SelectTab("...")顯示選項卡,但它也提供選項卡焦點。 我想展示一個特定的標簽,但要保持焦點。

我在網格中有數據行。 根據所選行的屬性,我顯示了一個不同的標簽頁,以具有不同的UI布局。 但是當使用箭頭鍵滾動行時,焦點會切換到選定的選項卡 - 我不想發生這種情況。

謝謝。

您可以嘗試在設置所選選項卡之前禁用TabControl ,然后重新啟用它。 這將防止它成為焦點。 我在一個帶有幾個控件的選項卡控件上對此進行了測試,並沒有看到任何視覺上的變化,但您必須在UI中嘗試它並查看它是否適合您。

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

為了安全起見,您可以將該行重新啟用finally塊中的TabControl,以確保它不會被禁用。

我認為沒有內置函數,但您可以這樣做:

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事件,從而導致無限循環。

這會選擇標簽頁,同時將焦點保持在頂部,如上所述:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM