标签能得到关注吗?

本文关键字:标签 | 更新日期: 2023-09-27 17:50:27

我在大学的c#考试中有一个问题。标签可以得到一个焦点吗?正如我在MSDN网站上看到的,所有控件都可以获得焦点,但其中一些是不可选择的。所以在我看来,正确的答案是"标签可以得到一个焦点,但不能被选中"。Label也有一个Focus()方法。请帮我理解。谢谢。

标签能得到关注吗?

是的,标签上有一个Focus()方法,是的,它是绝对正确的,它的工作;但是行为要不同。让我试着解释

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

所以你可以将一个输入控件与一个标签相关联,只要标签被选中,这个控件就会传递给相关联的输入控件。

这里的例子单击登录框中的电子邮件或密码标签,看看会发生什么,类似地,如果你在标签上调用焦点方法,焦点将传递到相关的控件。

来自文档:

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

因为Label控件是不可选择的,所以它不能接收输入焦点,即使它从Control继承了Focus()方法。因此,答案是

很容易发现控件是否可以获得焦点。读

.CanFocus

属性,从Control类继承。

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

    <
  • 面板/gh>
  • GroupBox
  • 图片框
  • ProgressBar
  • 分配器
  • 标签
  • LinkLabel(当控件中没有链接时)

:

Focus方法返回true控制成功接收输入的焦点。控件可以有输入在不显示任何视觉效果的情况下聚焦集中注意力的线索。这行为主要是由观察者观察到的下面列出的不可选择控件,或从它们派生的任何控件

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

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

您将看到标签上有一个名为CanFocus的只读属性,如果您在调试时查看该属性,您将看到它为false。

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

Label确实获得了焦点,但它将其升级为在其"for"属性中指定的输入字段。如:

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

在这种情况下,如果您单击标签,它将把焦点放在与之关联的输入字段"firstname"上。

这已经有一年了,但是我有一个类似的问题作为op。在我的情况下,它是一个用户控件,有一个单一的标签(停靠在填充)在它(它有其他的功能在幕后-它是一个日历控件,弹出一个日期选择器-不是标准的一个-在面板(popunder)或表单(popup))。

问题是,UserControls是真正打算作为容器和抵制焦点(把它推到子控件)-因为标签是唯一的子控件,它阻止UserControl获得焦点。使用只读文本框是一个糟糕的替代品,因为它缺乏垂直对齐,必须是多行来调整高度。

我在这里添加以下作为答案的原因是因为它是可能的(对不起那些在这里说它不是的人),我发现这篇文章和许多类似的文章在我看的时候没有什么帮助。无论如何,要做到这一点的方法是覆盖标签并设置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 );
        }
    }        
}

我不关心这样做在学术上(纯粹主义观点)是否正确,但有正当的理由允许输出控件(如标签)有时获得关注。