我对我大学关于C#的考试有一个问题。 可以标记获得焦点吗?正如我在MSDN网站上看到的那样,所有控件都可以获得焦点,但其中一些不可选。因此,在我看来,正确的答案是“标签可以获得焦点,但无法选择”。 Label也有一个Focus()方法。拜托,帮帮我理解。感谢名单。
答案 0 :(得分:8)
可以选择和接收控件 输入焦点如果满足以下条件 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)
此外:
如果是,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 );
}
}
}
我并不关心自己是否正确地(纯粹主义观点)这样做,但是有一个有效的重新定义允许输出控制(如标签)有时获得焦点。