Label可以获得焦点吗?

时间:2011-04-17 09:08:15

标签: c# .net winforms focus label

我对我大学关于C#的考试有一个问题。 可以标记获得焦点吗?正如我在MSDN网站上看到的那样,所有控件都可以获得焦点,但其中一些不可选。因此,在我看来,正确的答案是“标签可以获得焦点,但无法选择”。 Label也有一个Focus()方法。拜托,帮帮我理解。感谢名单。

6 个答案:

答案 0 :(得分:8)

来自documentation

  

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

由于Label控件无法选择,因此即使它从Focus()继承了Control方法,也无法接收输入焦点。因此,答案是

答案 1 :(得分:6)

是的,Label上有Focus()方法,是的,它绝对正确;但行为不同。让我试着解释

Label可以与某个输入控件相关联,例如用户名文本字段的标签,因此Associated Control的概念带有标签。 msdn上的AssociatedControlID

因此,您可以将输入控件与标签相关联,每当选择标签时,控件都会传递给相关的输入控件。

Example here点击登录框中的电子邮件或密码标签,看看发生了什么,同样如果你在标签上调用焦点方法,焦点将传递给相关控件。

答案 2 :(得分:2)

很容易找出控件的焦点是否得到关注。请阅读

.CanFocus

属性,它继承自Control类。

以下列表中的Windows窗体控件不可选。从这些控件派生的控件也是不可选择的。 (见MSDN documentation

  • 面板
  • 分组框中
  • 图片框
  • 进度
  • 分离器
  • 标签
  • LinkLabel(当控件中没有链接时)

此外:

  

如果是,Focus方法返回true   控制成功接收输入   焦点。控件可以有输入   聚焦,而不显示任何视觉   有重点的线索。这个   行为主要是由观察到的   下面列出的不可选控件,   或任何来自他们的控件。

     

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

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

答案 3 :(得分:2)

您会看到标签上有一个名为CanFocus的只读属性,如果您在调试时查看此属性,则会看到它是错误的。

从Control继承的每个控件都有焦点方法,但这并不意味着它可以被聚焦。

答案 4 :(得分:2)

Label确实获得焦点,但它会将其升级到其"中指定的输入字段。属性。喜欢:

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

在这种情况下,如果单击标签,它会将焦点抛到输入字段&#34; firstname&#34;与之相关。

答案 5 :(得分:0)

这是一年了,但是我和Op有类似的问题。在我的情况下,它是一个用户控件,它有一个标签(停靠在填充处)(它具有幕后的其他功能 - 它是一个日历控件,并弹出一个日期选择器 - 而不是标准的 - 在一个面板中(popunder)或表格(弹出窗口))。

问题在于UserControls实际上是作为容器并且抵制焦点(将其推送到子控件) - 因为标签是唯一的子控件,它会阻止UserControl获得焦点。使用readonly 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 );
        }
    }        
}

我并不关心自己是否正确地(纯粹主义观点)这样做,但是有一个有效的重新定义允许输出控制(如标签)有时获得焦点。