有没有办法使用户控件无法获得焦点?

11
有没有办法使UserControl无法获得焦点?
编辑: 所以,SetStyle(ControlStyles.Selectable, false)是正确的方法。 但是与Control有所不同。如果您从Control继承,则初始控件不会失去焦点。但是在单击从UserControl派生的控件之后,它会失去焦点。
ControlStyles.Selectable

当焦点从初始控件移开时应用。

6个回答

14

在你的构造函数中,在InitializeComponent()之后,你需要调用SetStyle并将ControlStyles.Selectable样式设置为false:

SetStyle(ControlStyles.Selectable, false);

1
当UserControl嵌入TextBox时,它无法正常工作。文本框将会捕获焦点。 - volody
1
@volody:是的,子控件可以捕获焦点,但 UserControl 不能。 - Adam Robinson
这对我不起作用。 - Elmue

6
除了ControlStyles.Selectable之外,还有一个ControlStyles.ContainerControl。关于这个主题的文档相当缺乏(如果为真,则控件是类似容器的控件),但它会影响子控件是否获取焦点而不是控件本身。 编辑: 我刚刚注意到另一个有趣的事实。在反射中查看UserControl时,它强制在OnMouseDown中设置输入焦点。因此,重写OnMouseDown并且无需调用base.OnMouseDown(e)即可解决问题,而不会产生任何副作用。
[EditorBrowsable(EditorBrowsableState.Advanced)]
protected override void OnMouseDown(MouseEventArgs e)
{
    if (!this.FocusInside())
    {
        this.FocusInternal();
    }
    base.OnMouseDown(e);
}

这是唯一正确的答案,对我有用:不要调用base.OnMouseDown(); - Elmue

2

是的,SetStyle(ControlStyles.Selectable, false); 只有在从控件进行继承时才起作用。

如果您是从用户控件进行继承,它将不起作用。

为了解决这个问题,我向用户控件添加了一个面板,并将该面板停靠到“Fill”。 然后将其他控件添加到面板中而不是用户控件。 它奏效了!


添加一个面板是一种笨拙且丑陋的解决方法,特别是当你有许多用户控件需要这样做时! - Elmue

1

如果CanFocus属性返回false,则UserControl或任何控件将无法接收焦点。如果您在反射器中查看代码,它基本上会检查3个属性,如果其中任何一个为false,则该控件将无法获得焦点。

  • IsHandleCreated
  • IsVisible
  • IsEnabled

将前两个属性设置为false并拥有一个功能良好的控件几乎是矛盾的。但是,如果您的控件可以在IsEnabled为false的情况下正常工作,则应该可以使用。


3
将ControlStyles.Selectable样式设置为false更加简单。 - Jeff Yates
如果控件被禁用,则所有子控件也将被禁用。这通常不是你想要的! - Elmue

0

如果将TabStop设置为false,您就可以更接近您想要的效果。这将防止控件在其所属窗体上方的对话框关闭时获得焦点。


这对我不起作用。 - Elmue

0

Enabled = false,也许是这样吗?


焦点被禁用了...但是会有一些副作用,比如背景图片的行为不同...不过还是很不错的尝试.. :) - Matze
如果控件被禁用,所有子控件也将被禁用。这通常不是您想要的! - Elmue

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