2009-09-17 12 views
5

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?)

+0

Muy útil, gracias. –

Respuesta

2

Debido a los problemas con Usando la propiedad DesignMode con controles anidados (y problemas relacionados), mi enfoque general a este problema es ni siquiera intentar que mis UserControls personalizados funcionen en modo de diseño. Por lo general, mis controles son muy complicados y están diseñados por el propietario, por lo que incluso si DesignMode funciona con controles anidados, sería necesario un gran esfuerzo de programación para mostrar algo significativo en el modo de diseño (y ralentizaría el trabajo de desarrollo, porque los controles requieren una cantidad significativa de tiempo de inicialización y configuración).

Normalmente solo agrego un método público Setup() o LoadData() que hace todo el trabajo, y solo llama a este método en tiempo de ejecución. En modo de diseño, el UserControl simplemente aparece como un cuadrado, lo que me ayuda a posicionarlo y nada más.

Estoy interesado en ver si tiene otras respuestas a esta pregunta, sin embargo, eso podría resolver sus problemas.

+0

Es una verdadera conveniencia poder ver su control en la vista de diseño, especialmente si desea subclasificarlos. Si no lo hace, al menos un marco para el diseño del control en un formulario está bien (como lo está haciendo). Si el control usa mucho estándar y necesita retocar las posiciones, las propiedades o los controladores de eventos de los componentes del control, entonces una vista de diseño realista se vuelve importante. Además, creo que es gratificante saber que mi control puede ser utilizado por alguien que puede no tener el código :). –

+0

@Sam: estoy totalmente de acuerdo con todo lo que dices, y algunas veces me veo obligado a intentar que mis controles funcionen en modo de diseño. Tan pronto como me encuentro con problemas serios, por lo general, renuncio, aunque a veces no lo suficientemente pronto. – MusiGenesis

Cuestiones relacionadas