【问题标题】:How to intercept the TAB key press to prevent standard focus change in C#如何拦截 TAB 按键以防止 C# 中的标准焦点更改
【发布时间】:2011-04-14 13:29:05
【问题描述】:

通常在按下 TAB 键时,您会将焦点更改到给定 Tab 键顺序中的下一个控件。我想阻止这种情况并让 TAB 键执行其他操作。就我而言,我想将焦点从组合框更改为完全不同的控件。我不能通过设置标签顺序来做到这一点。我需要以编程方式执行此操作。知道怎么做吗?似乎 KeyDown 和 KeyPress 事件无法正确处理 TAB 键。 谢谢。

【问题讨论】:

    标签: c# .net winforms focus


    【解决方案1】:

    在您的表单上覆盖 ProcessDialogKeyProcessTabKey,并根据所关注的控件执行您想要的逻辑。

    【讨论】:

      【解决方案2】:

      根据 JRS 使用 PreviewKeyDown 事件的建议,这会将按键发送到控件:

      private void textBox1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
      {
          if (e.KeyCode == Keys.Tab)
              e.IsInputKey = true;
      }
      

      如果你想自定义行为,你可以处理控件的 KeyDown 事件:

      private void textBox1_KeyDown(object sender, KeyEventArgs e)
      {
          if (e.KeyCode == Keys.Tab)
          {
              MessageBox.Show("The tab key was pressed while holding these modifier keys: "
                      + e.Modifiers.ToString());
          }
      }
      

      TextBoxBase 替代

      如果控件派生自TextBoxBase(即TextBoxRichTextBox),并且Multiline 属性设置为true,那么您可以简单地将AcceptsTab 属性设置为true

      TextBoxBase.AcceptsTab Property

      获取或设置一个值,该值指示在多行文本框控件中按下 TAB 键是否会在控件中键入 TAB 字符,而不是将焦点移到 Tab 键顺序中的下一个控件。

      【讨论】:

      • 我打算将e.SuppressKeyPress = true; 添加到示例中,但奇怪的是MessageBox 似乎阻止它工作(这是一个完全独立的问题)。
      【解决方案3】:

      覆盖控件的 LostFocus 事件,示例见下面的链接:

      http://msdn.microsoft.com/en-us/library/system.windows.forms.control.lostfocus.aspx

      【讨论】:

        【解决方案4】:

        由于我正在构建用户控件,因此我最终在控件上使用了PreviewKeyDown 事件。这避免了必须处理主机表单上的按键事件。

        http://msdn.microsoft.com/en-us/library/system.windows.forms.control.previewkeydown.aspx

        【讨论】:

          【解决方案5】:

          您可以在 KeyDown 活动中尝试此代码:

          if (e.KeyCode == Keys.Tab) {
            //your logic
            e.SuppressKeyPress = true;
          }
          

          如果单击的按钮是 Tab,则执行任何您想要的自定义逻辑,然后调用 SuppressKeyPress 以停止触发 KeyPress 事件并为您调用正常的 Tab 逻辑。

          【讨论】:

          • e.SuppressKeyPress = true;
          • 至少对于 Telerik 控件,按下 Tab 时不会触发 KeyDown 事件。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-03-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多