2009-04-24 23 views
11

¿Hay alguna manera de hacer que UserControl sea inafocable?¿Hay alguna manera de hacer que UserControl sea inafocable?

EDIT: Así SetStyle(ControlStyles.Selectable, false)

es el camino a seguir. Pero todavía hay una diferencia de Control. Si hereda el formulario Control, el control inicial no pierde el foco. Pero el foco después de hacer clic en el control que se deriva de UserControl y

ControlStyles.Selectable 

se aplica se elimina de control inicial.

Respuesta

12

en su constructor después InitializeComponent() que necesita para llamar SetStyle y establecer el estilo ControlStyles.Selectable a false:

SetStyle(ControlStyles.Selectable, false); 
+1

No funciona en caso de que UserControl haya incrustado TextBox. El cuadro de texto capturará el foco. – volody

+1

@volody: Sí, el control secundario puede capturar el foco, pero el 'UserControl' no puede. –

0

Habilitado = falso, ¿quizás?

+0

enfoque no funciona ...Pero hay efectos secundarios como el comportamiento diferente de las imágenes de fondo ... Así que intente ... :) – Matze

1

Un control de usuario, o cualquier control, no podrá recibir el foco si la propiedad CanFocus devuelve falso. Si miras el código en el reflector, básicamente verifica 3 propiedades y si alguna es falsa, entonces no podrá enfocarse.

  • IsHandleCreated
  • IsVisible
  • IsEnabled

Configuración de los dos primeros en falso y tener un control de funcionamiento es casi una contradicción. Si es posible que su control sea funcional con IsEnabled siendo falso, entonces debería funcionar.

+3

Mucho más fácil que simplemente establecer el estilo ControlStyles.Selectable en falso. –

2

Sí, el SetStyle (ControlStyles.Selectable, false); funciona solo si hereda de un control.

No funcionará, si está heredando de un control de usuario.

Para solucionar el problema, agregué un panel al control del usuario y acoplé el panel para "Rellenar". Resto agregado de los controles al panel en lugar del control de usuario. ¡Funcionó!

0

Puede acercarse a lo que desea estableciendo TabStop en falso. Eso evitará que el control se concentre cuando, por ejemplo, se cierra un cuadro de diálogo sobre su formulario propietario.

4

Además ControlStyles.Selectable también hay un ControlStyles.ContainerControl - la documentación es bastante escasa sobre este tema (Si es verdad, el control es un control contenedor como), pero de alguna manera afecta a si los controles secundarios consiguen centrarse en lugar del control sí mismo.

EDIT:

yo sólo he dado cuenta de otro hecho interesante. La visualización de un UserControl en el reflector muestra que obliga a configurar el foco de entrada en OnMouseDown. Sobrescribir OnMouseDown sin llamar a base.OnMouseDown (e) resuelve el problema sin efectos secundarios.

[EditorBrowsable(EditorBrowsableState.Advanced)] 
protected override void OnMouseDown(MouseEventArgs e) 
{ 
    if (!this.FocusInside()) 
    { 
     this.FocusInternal(); 
    } 
    base.OnMouseDown(e); 
} 
Cuestiones relacionadas