簡體   English   中英

TabControl中的C#Tab切換

[英]C# Tab switching in TabControl

我遇到了這樣的問題,我覺得很難克服。 在WinForms中,我得到了一個帶有n個TabPages的TabControl。 我想擴展Ctrl + Tab / Ctrl + Shift + Tab切換。 所以我寫了一些代碼,只要焦點在TabControl或Form上,它就能正常工作。 當應用程序焦點位於TabPage的INSIDE中時(例如放在TabPage內的按鈕上),在按下Ctrl + Tab的同時,我的代碼被忽略,TabControl自己跳到TabPage(避免我的代碼)。

誰有想法?

您需要從TabControl派生並重寫ProcessCmdKey,虛方法以覆蓋Ctrl-Tab行為。

例:

public class ExtendedTabControl: TabControl
{
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        if (keyData == (Keys.Control | Keys.Tab))
        {
            // Write custom logic here
            return true;
        }
        if (keyData == (Keys.Control | Keys.Shift | Keys.Tab))
        {
            // Write custom logic here, for backward switching
            return true;
        }
        return base.ProcessCmdKey(ref msg, keyData);
    }
}

TabControl具有處理Tab鍵的相當不尋常的處理。 它會覆蓋ProcessKeyPreview()方法以檢測Ctrl / Shift / Tab,然后在其OnKeyDown()方法中實現選項卡選擇。 它這樣做是因為它可以在它具有焦點本身以及任何子控件時檢測擊鍵。 並避免通過其中一個子控件踩踏自定義Tab鍵處理。 您可以通過重寫ProcessCmdKey()來使其工作,但是您將破壞想要響應選項卡的子控件。

最好的辦法是覆蓋它的OnKeyDown()方法。 在項目中添加一個新類並粘貼下面顯示的代碼。 編譯。 將新選項卡控件從工具箱頂部拖放到表單上。

using System;
using System.Windows.Forms;

class MyTabControl : TabControl {
  protected override void OnKeyDown(KeyEventArgs e) {
    if (e.KeyCode == Keys.Tab && (e.KeyData & Keys.Control) != Keys.None) {
      bool forward = (e.KeyData & Keys.Shift) == Keys.None;
      // Do your stuff
      //...
    }
    else base.OnKeyDown(e);
  }
}

請注意,您還應該考慮Ctrl + PageUp和Ctrl + PageDown。

暫無
暫無

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

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