【问题标题】:How to disable navigation on WinForm with arrows in C#?如何在 C# 中使用箭头禁用 WinForm 上的导航?
【发布时间】:2009-08-23 10:23:43
【问题描述】:

我需要禁用表单上的箭头更改焦点。有没有简单的方法可以做到这一点?

谢谢

【问题讨论】:

    标签: c# winforms focus


    【解决方案1】:

    类似的东西:

        private void Form1_Load(object sender, EventArgs e)
        {
            foreach (Control control in this.Controls)
            {
                control.PreviewKeyDown += new PreviewKeyDownEventHandler(control_PreviewKeyDown);
            }
        }
    
        void control_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
        {
            if (e.KeyCode == Keys.Up || e.KeyCode == Keys.Down || e.KeyCode == Keys.Left || e.KeyCode == Keys.Right)
            {
                e.IsInputKey = true;
            }
        }
    

    【讨论】:

    • 完美运行。谢谢!对其他人的简短说明:foreach(this.Controls 中的控制控件)不包含所有控件 - 您可能在表单上有容器(例如 system.windows.forms.panel)。
    • 不会想到这一点,但这似乎完全有效。 (我的目标是有条件地禁用 Enter,但想法相同。)谢谢!
    • 啊,谢谢!关键是 PreviewKeyDown 事件而不是 KeyDown 事件。我试图在 KeyDown 事件下解决问题,但是一旦我将空格键设置为输入键,它就解决了。现在我的按钮不会被空格点击:)
    【解决方案2】:

    我最终得到了下面的代码,它将功能设置为表单上的每个控件:

    (代码基于andynormancx的那个)

    
    
    private void Form1_Load(object sender, EventArgs e)
    {
        SetFeatureToAllControls(this.Controls);    
    }
    
    private void SetFeatureToAllControls(Control.ControlCollection cc)
    {
        if (cc != null)
        {
            foreach (Control control in cc)
            {
                control.PreviewKeyDown += new PreviewKeyDownEventHandler(control_PreviewKeyDown);
                SetFeatureToAllControls(control.Controls);
            }
        }
    }
    
    void control_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
    {
        if (e.KeyCode == Keys.Up || e.KeyCode == Keys.Down || e.KeyCode == Keys.Left || e.KeyCode == Keys.Right)
        {
            e.IsInputKey = true;
        }
    }
    

    【讨论】:

      【解决方案3】:

      我尝试了这种方法,表单处理一次预览事件。它生成的代码比其他选项少。

      只需将此方法添加到表单的PreviewKeyDown 事件中,并将KeyPreview 属性设置为true

      private void form1_PreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
      {
          switch (e.KeyCode)
          {
              case Keys.Up:
              case Keys.Down:
              case Keys.Left:
              case Keys.Right:
                  e.IsInputKey = true;
                  break;
              default:
                  break;
          }
      }
      

      【讨论】:

      • 嗨,卡洛斯。我想使用你的较短版本,但是当我测试它时,不幸的是它没有做它应该做的事情..(我当然记得设置Form.KeyPreview=true)。只有当我在 Form_Load 中添加了 foreach() 时,行为才发生变化。你测试过吗?
      • 如果表单包含多于一层的容器层次结构,这将不起作用。
      【解决方案4】:

      您应该在表单上将KeyPreview 设置为true。处理 KeyDown/KeyUp/KeyPress 事件并将事件处理程序中的 e.Handled 设置为 true 以获取您想要忽略的键。

      【讨论】:

      • 那个方法好像不行,PreviewKeyDownEventArgs上没有e.Handled
      • e.Handled 存在但在方法中:private void Form1_KeyUp(object sender, KeyEventArgs e), KeyDown 等。我对这种方法也有问题。我会在干净的项目上尝试一下。
      • 是的,它存在于 KeyDown 事件中,但设置它并没有帮助,导航已经发生了。
      • 我不确定导航是什么时候制作的。下面的建议很有效。
      猜你喜欢
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 2012-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      • 2015-07-21
      相关资源
      最近更新 更多