Pregunta

En WinForms, para establecer el foco en un control específico, parece que siempre termino llamando Control.Select () y Control.Focus () para que funcione.

¿Cuál es la diferencia? ¿Es este el enfoque correcto?

¿Fue útil?

Solución

  

Focus es un método de bajo nivel destinado principalmente a autores de controles personalizados. En su lugar, los programadores de aplicaciones deben usar el método Select o la propiedad ActiveControl para los controles secundarios, o el método Activate para los formularios.

http://msdn.microsoft. com / en-us / library / system.windows.forms.control.focus.aspx

Otros consejos

Focus () es la función de bajo nivel que realmente establece el enfoque.

Select () es un método de nivel alto. Primero mira iterativamente hacia arriba en la jerarquía principal del control hasta que encuentra un control contenedor. Luego establece la propiedad ActiveControl de ese contenedor (al control llamado). Sin embargo, la lógica en esos métodos no es sencilla, y hay un manejo especial para los contenedores UserControl.

Para ver un ejemplo de cómo son diferentes, si está tratando de establecer un control para una aplicación de Formularios para que se enfoque de forma predeterminada cuando lo abra, solo Select () funcionará cuando se le solicite en el constructor después de InitializeComponent (). Enfoque () no lo hará.

Solo para agregar a este hilo, encontré que al escribir un control de usuario que movía otros controles de un formulario a otro (formulario creado recientemente). La forma original ya no pudo seleccionar el control, pero el uso del enfoque le permitió hacerlo. Creo que esto enfatiza las respuestas sobre los niveles en que funcionan estos métodos. Pero también significa que no es lo suficientemente simple como para decir que use Select en el nivel superior, ya que Select ya no funciona como se esperaba en la forma original (no es que deba ser colocado en una forma diferente; lo acepto)

El enfoque (), en algunas situaciones, puede hacer que una ventana que posee el control gane el enfoque si no tenía el enfoque. Select () no provoca una captura de foco por la ventana.

Por experiencia personal, escribí un control de usuario que heredaba el ComboBox de Windows. Tuve que escribir un código para anular el evento OnEnter y tenía una declaración diciendo que

If Me.Focused Then ... Else ...

Sin embargo, desafortunadamente devolvió el resultado inesperado. Si llamé a MyCustomerComboControl.Select (en cualquiera de los eventos Load, Shown o Activated) llamó al método OnEnter pero no pude registrar que tenía el foco (es decir, Focused era False) pero Si llamaba Focus funcionaría. Además, Select funcionó si el formulario estaba abierto, es decir, si seleccionaba otro control y luego volvía a seleccionar el control original, todo estaba bien. Por lo tanto, en cualquier otra circunstancia que no sea mi escenario, use Select porque así lo dice más arriba.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top