Siguiendo con esta pregunta , ¿es posible detectar si uno está en modo de diseño o en tiempo de ejecución desde dentro del constructor de un objeto?
Me doy cuenta de que puede que esto no sea posible y que tendré que cambiar lo que quiero, pero por ahora me interesa esta pregunta específica.
ISite.DesignMode
.Estás buscando algo así:
También puede hacerlo comprobando el nombre del proceso:
fuente
devenv
.Componente ... que yo sepa no tiene la propiedad DesignMode. Esta propiedad es proporcionada por Control. Pero el problema es que cuando CustomControl se encuentra en un formulario en el diseñador, este CustomControl se ejecuta en modo de tiempo de ejecución.
He experimentado que la propiedad DesignMode funciona correctamente solo en Form.
fuente
Los controles (formularios, controles de usuario, etc.) heredan lo
Component class
que tienebool property DesignMode
:fuente
OnHandleCreated
.IMPORTANTE
¡Hay una diferencia entre usar Windows Forms o WPF !
Tienen diferentes diseñadores y necesitan diferentes controles . Además, es complicado mezclar formularios y controles WPF. (por ejemplo, controles WPF dentro de una ventana de formularios)
Si solo tiene Windows Forms , use esto:
Si solo tiene WPF , use esta verificación:
Si tiene un uso mixto de Formularios y WPF, use una marca como esta:
Para ver el modo actual, puede mostrar un cuadro de mensaje para depurar:
Observación:
Debe agregar los espacios de nombres System.ComponentModel y System.Diagnostics .
fuente
Debe usar la propiedad Component.DesignMode. Hasta donde yo sé, esto no debería usarse desde un constructor.
fuente
if (!DesignMode)
a los métodos de OnPaint para asegurarme de que no sea spam el tiempo de diseño.Otro método interesante se describe en ese blog: http://www.undermyhat.org/blog/2009/07/in-depth-a-definitive-guide-to-net-user-controls-usage-mode-designmode-or -modo de usuario/
Básicamente, prueba que el ensamblado en ejecución se haga referencia estáticamente desde el ensamblado de entrada. Evita la necesidad de realizar un seguimiento de los nombres de ensamblados ('devenv.exe', 'monodevelop.exe' ..).
Sin embargo, no funciona en todos los demás escenarios, donde el ensamblado se carga dinámicamente (VSTO es un ejemplo).
fuente
Con la cooperación del diseñador ... Se puede utilizar en controles, componentes, en todos los lugares
MessageBox.Show(
las líneas deben eliminarse. Solo me asegura que funciona correctamente.fuente
Puedes usar esto
fuente
Este es el método que utilicé en mi proyecto:
¡¡¡Atención !!!: ¡ El código devuelto bool indica que NO está en modo de diseño!
fuente
fuente
La solución LicenseManager no funciona dentro de OnPaint, ni tampoco this.DesignMode. Recurrí a la misma solución que @Jarek.
Aquí está la versión en caché:
Tenga en cuenta que esto fallará si está utilizando un IDE de terceros o si Microsoft (o su usuario final) decide cambiar el nombre del ejecutable VS a otro que no sea 'devenv'. La tasa de fallas será muy baja, solo asegúrese de lidiar con cualquier error resultante que pueda ocurrir en el código que falla como resultado de esto y estará bien.
fuente
Si desea ejecutar algunas líneas cuando se está ejecutando pero no en el diseñador de Visual Studio, debe implementar la propiedad DesignMode de la siguiente manera:
fuente
Los temporizadores que están habilitados de forma predeterminada pueden causar fallas al usar controles personalizados / de usuario. Deshabilítelos de forma predeterminada y habilítelos solo después de verificar el modo de diseño
fuente