【发布时间】:2011-02-27 19:32:13
【问题描述】:
我想显示一个表单,但我不想让任何控件集中。例如,现在当显示表单时,tabindex 为 0 的按钮是焦点。我希望表单本身而不是按钮成为焦点,这样如果用户不小心按了一个键,它就不会做任何事情。这可能吗?谢谢!
【问题讨论】:
我想显示一个表单,但我不想让任何控件集中。例如,现在当显示表单时,tabindex 为 0 的按钮是焦点。我希望表单本身而不是按钮成为焦点,这样如果用户不小心按了一个键,它就不会做任何事情。这可能吗?谢谢!
【问题讨论】:
最简单的解决方案是:
protected override void OnShown(EventArgs e)
{
base.OnShown(e);
ActiveControl = null;
}
或者,如果所有控件都在停靠填充的面板内,您可以聚焦面板:
protected override void OnShown(EventArgs e)
{
base.OnShown(e);
pnlMain.Focus();
}
无论采用哪种方法,按 Tab 键都会将第一个控件聚焦在 Tab 键顺序中。
【讨论】:
如果您在加载页面时将标签设置为焦点,它将不起作用。
您需要做的是将页面的活动控件设置为您要关注的标签而不是文本框。
例如:this.ActiveControl = lbltest;
【讨论】:
vaitrafra 的回答就足够了,但是如果您的表单上碰巧有标签,您也可以将焦点设置在该标签上。接受的答案here 提供了更多关于为什么您不能确保表单上的每个控件都没有焦点的原因。
【讨论】:
试试这个:将Panel 控件添加到您的表单并保持默认设置。面板可以有任何尺寸并且可以放置在任何地方。我会打电话给这个成员m_panel。在您的构造函数中,将表单的ActiveControl 属性设置为m_panel。最后,确保面板的TabStop 属性设置为false(默认设置)。
当表单加载时,m_panel 将获得焦点。但是,由于面板没有边框并且与表单背景颜色相同,因此没有迹象表明它存在,因此您可以有效地说表单本身具有焦点,如您所愿。当用户第一次点击 Tab 或单击控件时,面板将不在等式中(因为 TabStop 是 false)并且一切都会正常工作。
注意:您也可以使用空的Label 而不是Panel,只要适合您。您甚至可以使用现有标签之一。请记住使用ActiveControl 来指定感兴趣的控件,或者通过调用Focus 显式聚焦它,因为它不会自动获得焦点。
【讨论】:
您最初应该将焦点放在相对无害的地方,例如“取消”按钮,如果您的表单包含这样的东西。
我有 testet 的解决方法;
private void Form1_Shown(object sender, EventArgs e)
{
textBox1.TabStop = false;
textBox1.Focus();
textBox1.Left = -300;
}
这通过将文本框移出可见区域来“隐藏”具有焦点的文本框。 通过以这种骇人听闻的方式进行操作,文本框可以保持焦点。
[编辑] 这(显然)要求您在表单上有一个名为 textBox1 的文本框,该文本框不用于其他任何内容。
【讨论】:
您可以在_Load 中使用MyInvisibleLabel.Select();,或者,如果有的话,只需点击退出/取消/关闭按钮。
【讨论】:
您可以将每个控件的 TabStop 属性设置为 false,但您将无法在控件之间切换。这对您来说可能是也可能不是一个好的解决方案,但它应该阻止任何控件接收输入,直到用户单击它。
【讨论】:
不,你不能。 顺便说一句,有一个解决方法。将隐藏控件添加到表单(例如文本框)并执行
TextBox1.Focus();
在 Form_Shown 或 Form_Load 事件中。
【讨论】:
Control.CanFocus 的文档,我认为隐藏的 (Visible = false) 控件无法获得焦点。