标签可以获得焦点吗?

6

我在大学的C#测试中有一个问题。 标签能否获得焦点? 根据MSDN网站的说明,所有控件都可以获得焦点,但其中一些控件不能被选择。因此,我认为正确答案是“标签可以获得焦点,但不能被选择”。此外,标签还有一个Focus()方法。请帮助我理解。谢谢。

6个回答

9
根据文档,只有当以下条件都为真时,控件才能被选中并接收输入焦点:ControlStyles的Selectable值设置为true、它被包含在另一个控件中,并且所有父控件都可见和启用。
因此,即使从Control继承了Focus()方法,Label控件也无法被选中,因为它不可选择。因此,答案是否定的。

2
是的,这是正确的答案。FocusCanFocus属性的存在实际上并不重要。Windows API(WinForms基于此)有一个硬性规定,规定哪些控件可以接收焦点。标签(用于显示静态文本)是其中之一,它永远无法获得焦点。没有例外。 - Cody Gray

9
是的,Label上有一个Focus()方法,它可以正常使用,但是表现不同。让我试着解释一下。
一个Label可以与某个输入控件相关联,例如一个用户名文本框的标签,因此有一个“关联控件”的概念。可以在MSDN上了解AssociatedControlID。
因此,您可以将输入控件与标签相关联,并且每当选择标签时,控件就会传递到关联的输入控件中。
此处示例中,单击登录框中的电子邮件或密码标签,然后查看发生了什么。类似地,如果在标签上调用focus方法,则焦点将传递给关联的控件。

非常感谢,讲得非常清楚。但是我没有标记答案是关于.NET 2.0的!所以标签中没有这个属性。它只适用于ASP .NET吗?无论如何,非常感谢。 - Frankie Drake
4
在WinForms中,当你尝试将焦点设置到一个“Label”控件时,具有下一个标签索引的控件将会接收到焦点。比如说,你有一个标签的标签索引为0,一个文本框的标签索引为1。当你尝试将焦点设置到标签上时,文本框会自动获得焦点。 - Cody Gray

2

如果想知道控件能否获得焦点,很容易找到答案。只需查看

.CanFocus

该属性是从Control类继承的。

以下列表中的Windows Forms控件不可选择。从这些控件派生的控件也不可选择。(参见MSDN文档

  • Panel
  • GroupBox
  • PictureBox
  • ProgressBar
  • Splitter
  • Label
  • LinkLabel(当控件中没有链接时)

另外:

如果控件成功接收输入焦点,则Focus方法返回true。即使没有显示任何具有焦点的视觉提示,控件仍可以具有输入焦点。这主要是由下面列出的不可选择的控件或任何从它们派生的控件所观察到的行为。

如果满足以下所有条件,则控件可以被选择并接收输入焦点:ControlStyles的Selectable值设置为true,它包含在另一个控件中,并且其所有父控件都是可见和启用的。

如果需要一个类似于Label的可聚焦控件,只需使用TextBox并将其设置为只读即可。设置一些其他属性(样式,不可选择等),你就完成了。


2
你会发现在标签上有一个只读属性叫做CanFocus,如果你在调试时查看此属性,你会发现它为false。
每个继承自控件的控件都有焦点方法,但这并不意味着它可以被聚焦。

标签无法获得焦点? - Frankie Drake
1
不,即使该方法已公开,标签本身也无法获得焦点。 - TBohnen.jnr

1

这篇文章已经有一年了,但我遇到了与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 );
        }
    }        
}

我并不关心这样做是否符合学术(纯粹主义)观点,但有时允许输出控制(如标签)获得焦点是有有效的理由的。


1
对我来说,上面的代码有一半是有效的。如果我点击SelectableLabel,它确实会获得焦点,但似乎无法使用Tab键选择控件——它似乎被排除在Tab顺序之外。 - Hugh W

1

标签确实会获得焦点,但它会将焦点转移到其“for”属性指定的输入字段。例如:

<label for="firstname">First Name</label><input type="text" name="firstname" />

在这种情况下,如果您单击标签,它将使焦点转移到与其相关联的输入字段“firstname”。

2
我认为这是一个关于C#的问题,而不是HTML的问题。 - jm.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接