Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 轨迹栏一直在窃取我的焦点_C#_Visual Studio_Oop_Focus_Trackbar - Fatal编程技术网

C# 轨迹栏一直在窃取我的焦点

C# 轨迹栏一直在窃取我的焦点,c#,visual-studio,oop,focus,trackbar,C#,Visual Studio,Oop,Focus,Trackbar,有人问了好几次,但我都没法回答。 我的问题是,每次我想要更改轨迹栏的值时,即使在单击窗口的其他部分时,也会保持焦点。当我想使用这些键时,它们只在trackbarbox中工作 我试了什么 -我试图将CausesValidation/TabStop/topmest设置为false/true -我尝试使用MouseLeave/FocusEnter事件,使用this.focus() -我试着把 protected override bool IsInputKey(Keys keyData) { r

有人问了好几次,但我都没法回答。 我的问题是,每次我想要更改轨迹栏的值时,即使在单击窗口的其他部分时,也会保持焦点。当我想使用这些键时,它们只在trackbarbox中工作

我试了什么

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

-我尝试使用
MouseLeave
/
FocusEnter
事件,使用
this.focus()

-我试着把

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

protected override bool ShowWithoutActivation
{
   get { return true; }
}
输入主代码

下面是程序的屏幕截图,以了解我的问题:

通常的方法是在设置
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);
    }
当然,您可能希望添加过滤器,以防止表单不处理的密钥路由

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

如果不希望,则需要向事件添加筛选器:

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;

把焦点放在别的事情上?你无法聚焦表单-没有什么需要聚焦的。作为最后手段,您可以对焦屏幕外的文本框。但我必须对我的表单按键事件做出反应。在该区域(您也有此按键事件)的客户端上也可以使用“鼠标下键/单击”事件,在该事件处理程序中,删除焦点或将焦点设置为另一个控件。@bravobyte因此对文本框上的按键做出反应。控制全部通过一个。嗯,这比我想的要容易。。我只需要更改按键预览。。谢谢你