He visto varias publicaciones y preguntas sobre la propiedad DesignMode de Forms y UserControls. La idea es que desee comprobar si el control está en modo de diseño (por ejemplo, el control se muestra en Visual Studio Designer) y evitar el código que solo se puede ejecutar, bueno, en tiempo de ejecución. El problema que he visto muchos tiene, y mi memoria fallida también me lo ha expuesto recientemente, es que la propiedad DesignMode no funciona en el constructor y no funciona para los controles anidados. Sin embargo, funciona extremadamente bien en el controlador de eventos Load para su control o formulario.Uso de la propiedad DesignMode frente a LicenseManager.UsageMode
Cuando lo piense bien, el código en los constructores de los formularios o UserControls solo debe tratar con el estado que no requiere que se cargue el formulario. El código que trata con la inicialización de objetos de IU debería ubicarse en el controlador de eventos Load para el control. Y en esa función, la propiedad DesignMode funciona. El Diseñador usará su valor adecuado en ese momento.
En principio, se ha llamado al método InitializeComponent(), pero en realidad, cuando se muestra el control en la vista Diseño, el Diseñador solo analiza esa función, no la ejecuta. El Diseñador, sin embargo, ejecuta el constructor de controles anidados. Si necesita colocar el código de inicialización en el constructor, use la clase System.ComponentModel.LicenseManager, tiene una propiedad estática llamada UsageMode que toma los valores de DesignTime o RunTime. ¡Puedes confiar absolutamente en esa propiedad en el constructor de tu control, pero solo en el constructor!
Había olvidado esa pequeña sutileza en la aplicación en la que estoy trabajando en este momento. Para evitar el problema, me estoy adhiriendo ahora al patrón de que todos los controles y formularios que necesitan una inicialización adicional deben implementar un controlador para el evento Load. Allí, la propiedad DesignMode funciona perfectamente y nunca tengo problemas para abrir mi control de usuario y formularios en el Diseñador.
Si tengo una jerarquía de clases, a veces hago que ese controlador de eventos sea protegido virtual, y solo lo anulo cuando la subclase necesita una inicialización adicional.
Me pregunto, sin embargo, si hay mejores métodos por ahí, o si hay algo malo acerca de este patrón (otra que tener que implementar un controlador de eventos de carga muchas veces?)
Muy útil, gracias. –