是否有键盘快捷键可以专注于已知的Tabindex

时间:2018-10-07 21:13:14

标签: windows winforms

当Windows窗体具有焦点时,您可以通过按{TAB}键,以Tabindex顺序遍历所有TabStop属性设置为True的控件。

类似地,您可以使用{Shift + TAB}以相反的顺序浏览它们

是否有任何键盘快捷键可将焦点移至已知(或绝对)的Tabindex(例如最低或最高),而不是将其相对于活动控件移动?

如果是,MS是否会在任何地方对此进行记录?

1 个答案:

答案 0 :(得分:1)

AFAIK不需要任何其他操作。您需要自己做。但是,这并不困难,您只需要通过覆盖ProcessCmdKey方法来检查热键,然后调用Control.Focus()进行适当的控制即可:

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    if (keyData == (Keys.Control | Keys.D1))
    {
        textBox1.Focus();
        return true;
    }
    return base.ProcessCmdKey(ref msg, keyData);
}

您甚至可以更进一步,以提供多个控件的快捷方式,并且还可以通过具有包含快捷键和要关注的控件的字典来在运行时管理控件及其快捷键:

Dictionary<Keys, Control> FocusShortcuts;

public Form1()
{
    InitializeComponent();

    FocusShortcuts = new Dictionary<Keys, Control>();
    FocusShortcuts.Add(Keys.Control | Keys.D1, textBox1);
    FocusShortcuts.Add(Keys.Control | Keys.D2, textBox2);
    FocusShortcuts.Add(Keys.Control | Keys.D3, textBox3);
}

protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
    Control control;
    if (FocusShortcuts.TryGetValue(keyData, out control))
    {
        control.Focus();
        return true;
    }
    return base.ProcessCmdKey(ref msg, keyData);
}

更新

如果相反,您想通过其Tab键将焦点设置为控件,则可以将textBox1.Focus();替换为以下内容:

int someIndex = 5;
Control control = this.Controls.OfType<Control>()
                      .FirstOrDefault(c => c.TabIndex == someIndex);
if (control != null) control.Focus();

您只需要将someIndex的值更改为您选择的索引,并使用控件的容器更改this(如果容器是当前表单/ UserControl,则可以保留它)