跟踪栏一直在偷走我的注意力
本文关键字:我的 注意力 一直 跟踪 | 更新日期: 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;