已被问过几次,但我无法使用任何答案。 我的问题是,每当我想改变轨迹栏值时,即使我点击窗口的其他部分也会保持焦点。当我想使用它们时,它们只能在轨道栏中工作。
我尝试了什么?:
- 我尝试将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
答案 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;