我在大学的C#测试中有一个问题。 标签能否获得焦点? 根据MSDN网站的说明,所有控件都可以获得焦点,但其中一些控件不能被选择。因此,我认为正确答案是“标签可以获得焦点,但不能被选择”。此外,标签还有一个Focus()方法。请帮助我理解。谢谢。
如果想知道控件能否获得焦点,很容易找到答案。只需查看
.CanFocus
该属性是从Control类继承的。
以下列表中的Windows Forms控件不可选择。从这些控件派生的控件也不可选择。(参见MSDN文档)
另外:
如果控件成功接收输入焦点,则Focus方法返回
true
。即使没有显示任何具有焦点的视觉提示,控件仍可以具有输入焦点。这主要是由下面列出的不可选择的控件或任何从它们派生的控件所观察到的行为。如果满足以下所有条件,则控件可以被选择并接收输入焦点:ControlStyles的Selectable值设置为true,它包含在另一个控件中,并且其所有父控件都是可见和启用的。
如果需要一个类似于Label的可聚焦控件,只需使用TextBox并将其设置为只读即可。设置一些其他属性(样式,不可选择等),你就完成了。
这篇文章已经有一年了,但我遇到了与Op类似的问题。在我的情况下,是一个用户控件上只有一个标签(停靠在填充位置),它在幕后有其他功能 - 它是一个日历控件,并弹出一个日期选择器 - 不是标准的 - 在面板(popunder)或表单(popup)中。
问题在于UserControl实际上是作为容器而设计的,它会抵制焦点(将其推送到子控件) - 由于标签是唯一的子控件,它会阻止UserControl获得焦点。使用只读TextBox是一个糟糕的替代方案,因为它缺乏垂直对齐并且必须是多行才能调整高度。
我在这里添加以下内容作为答案,因为它是可能的(对不起,那些说不可能的人),当我查看时,我发现这篇文章和许多类似的文章都没有什么帮助。无论如何,解决方法是覆盖Label并设置SetStyle - 还有OnPaint以绘制焦点矩形(我手动绘制了我的,因为DrawFocusRectangle似乎没有做任何事情) - 如下所示:
internal class SelectableLabel: Label
{
public SelectableLabel():base()
{
SetStyle(ControlStyles.Selectable, true);
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
//ControlPaint.DrawFocusRectangle(e.Graphics, ClientRectangle);
if (!Focused) return;
if (BorderStyle == BorderStyle.Fixed3D)
{
e.Graphics.DrawLines(Pens.CadetBlue, new[] { new Point(1, Height - 1), new Point(1, 1), new Point(Width - 1, 1) });
e.Graphics.DrawLines(Pens.Aquamarine, new[] { new Point(2, Height - 1), new Point(Width - 1, Height - 1), new Point(Width - 1, 2) });
}
else
{
e.Graphics.DrawRectangle(Pens.Aquamarine, 0, 0, Width - 1 , Height - 1 );
}
}
}
我并不关心这样做是否符合学术(纯粹主义)观点,但有时允许输出控制(如标签)获得焦点是有有效的理由的。
标签确实会获得焦点,但它会将焦点转移到其“for”属性指定的输入字段。例如:
<label for="firstname">First Name</label><input type="text" name="firstname" />
Focus
或CanFocus
属性的存在实际上并不重要。Windows API(WinForms基于此)有一个硬性规定,规定哪些控件可以接收焦点。标签(用于显示静态文本)是其中之一,它永远无法获得焦点。没有例外。 - Cody Gray