Trackbar一直在窃取我的焦点

时间:2016-01-16 14:58:59

标签: c# visual-studio oop focus trackbar

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

我尝试了什么?:

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

- 我尝试使用MouseLeave / FocusEnter个事件通过this.Focus()

将焦点重新设置在我的表单上

- 我试图把

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

和/或

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

进入主要代码

这是一个了解我的问题的程序截图: It's german but that doesn't matter. I want to press Enter while I'm drawing the line but the trackbar keeps focused and blocks it

1 个答案:

答案 0 :(得分:0)

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

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

但您也可以使用PreviewKeyDown事件。确保将Form的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;