2009-04-24 26 views
11

有没有办法使UserControl不可折叠?有没有办法使UserControl不可折叠?

编辑: 所以SetStyle(ControlStyles.Selectable, false)

是要走的路。但仍然有差异Control。如果您继承Control,则初始控件不会失去焦点。但是点击是从UserControl

ControlStyles.Selectable 

派生的控制后应用焦点从最初的控制中删除。

回答

12

在你的构造InitializeComponent()后,你需要调用SetStyle并设置ControlStyles.Selectable风格false

SetStyle(ControlStyles.Selectable, false); 
+1

当UserControl嵌入TextBox时它不起作用。文本框将捕捉焦点。 – volody 2010-09-22 18:08:46

0

Enabled = false,也许?

+0

焦点被禁用...但有副作用,如背景图像的不同行为......所以不错的尝试.. :) – Matze 2009-04-24 12:54:41

1

如果CanFocus属性返回false,UserControl或任何Control将无法获得焦点。如果您查看反射器中的代码,它会基本检查3个属性,如果有任何属性为false,则它将不可对焦。

  • IsHandleCreated
  • ISVISIBLE
  • 的IsEnabled

设置前两个为false,并且有一个有效的控制是非常矛盾的。如果有可能让您的控件在IsEnabled为false的情况下起作用,那么应该可以工作。

+3

更容易设置ControlStyles.Selectable风格为false。 – 2009-04-24 13:14:26

2

是的,的SetStyle(ControlStyles.Selectable,假);只有在您从控件继承时才有效。

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

为了解决这个问题,我在用户控件中添加了一个面板,并将面板停靠在“填充”上。 将控件的其余部分添加到面板而不是用户控件。有效!

0

通过将TabStop设置为false,您可以更接近想要的内容。例如,当它自己的窗体上方的对话框关闭时,这将阻止控件集中。

4

此外ControlStyles.Selectable也有ControlStyles.ContainerControl - 文档这个主题相当少(如果为真,控制是一个容器类控制),但如果孩子的控制得到,而不是集中控制的它在某种程度上影响本身。

编辑:

我刚才注意到另一个有趣的事实。在反射器中查看UserControl显示它强制在OnMouseDown中设置输入焦点。因此,在不调用base.OnMouseDown(e)的情况下重写OnMouseDown可以解决此问题,且不会产生副作用。

[EditorBrowsable(EditorBrowsableState.Advanced)] 
protected override void OnMouseDown(MouseEventArgs e) 
{ 
    if (!this.FocusInside()) 
    { 
     this.FocusInternal(); 
    } 
    base.OnMouseDown(e); 
} 
相关问题