跟踪栏一直在偷走我的注意力

本文关键字:我的 注意力 一直 跟踪 | 更新日期: 2023-09-27 18:30:36

已经被问了几次,但我无法使用任何答案。我的问题是,每次我想更改跟踪栏值时,即使我单击窗口的其他部分,也会保持焦点。当我想使用键时,它们只是在轨道栏框中工作。

我试了什么?

-我试图将CausesValidation/TabStop/Topmost设置为false/true

-我尝试使用 MouseLeave/FocusEnter 事件将焦点重新放在我的表单上,this.Focus()

-我试图把

protected override bool IsInputKey(Keys keyData)
{
   return true;
}

和/或

protected override bool ShowWithoutActivation
{
   get { return true; }
}

进入主码

这是程序的屏幕截图,以了解我的问题:这是德国人,但这并不重要。我想在画线时按 Enter 键,但跟踪栏保持焦点并阻止它

跟踪栏一直在偷走我的注意力

通常的方法是在设置KeyPreview = true后覆盖OnKeyDown事件:

    protected override void OnKeyDown(KeyEventArgs e)
    {
        base.OnKeyDown(e);
        // your code here..
        Text = "Testing: KeyCode" + e.KeyCode;
    }

但您也可以使用 PreviewKeyDown 事件。确保将窗体的 KeyPreview 属性设置为 true,并向所有可能窃取/接收焦点的控件添加一个公共事件!

由于控件的PreviewKeyDown事件使用不同的参数,因此您需要将事件路由到窗体的KeyDown事件:

    private void CommonPreviewKeyDown(object sender, PreviewKeyDownEventArgs e)
    {
        Form1_KeyDown(this, new KeyEventArgs(e.KeyCode));
    }

    private void Form1_KeyDown(object sender, KeyEventArgs e)
    {
        // your code here..
        Text = "Testing: KeyCode" + e.KeyCode;
    }

您可能希望在代码中挂接句柄:

    void routeKeys(Control container)
    {
       foreach (Control ctl in container.Controls)
            if (ctl.CanFocus) ctl.PreviewKeyDown += CommonPreviewKeyDown;
    }

这样称呼它:

    public Form1()
    {
        InitializeComponent();
        routeKeys(this);
    }

当然,您可能希望添加过滤器以防止您的表单无法处理的键的路由。

这两种技术之间的区别在于,当您覆盖Form.OnKeyDown时,您将从任何地方接收密钥事件;这将包括例如文本框,其中您的字符和编辑密钥都路由到表单。

如果您不希望这样做,则需要向事件添加过滤器:

if (tb_notes.Focused) return;
if (tb_moreNotes.Focused) return;
if (rtb_edit.Focused) return;

第二种方法让您决定在路由中包含或排除哪些控件..:

if (ctl.CanFocus && !(ctl is TextBox || ctl is RichTextBox))            
    ctl.PreviewKeyDown += CommonPreviewKeyDown;