[英]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.