none
DesignMode no funciona RRS feed

  • Pregunta

  • Después de comprobar que DesignMode no funciona bien con el control de usuario heredado que estoy usando, he implementado la solución de se da aquí:

    http://social.msdn.microsoft.com/Forums/es-ES/vcses/thread/86c30f8d-7faf-468f-977c-e1a0ccc1a239

    Pero tampoco funciona.

    Seguimos con los controles de usuario heredados. En uno base hago referencia a una clase estática que no está disponible en tiempo de diseño, por lo que uso el código:

     

    if (!IsInDesignMode())
      c_lbDevices.Width = Globals.IniFile.ReadInt(Name, "Splitter", c_lbDevices.Width);
    

    me lanza una excepción en tiempo de diseño cuando intento mostrar el control hijo (ese código está en el padre).


    Pero siempre me devuelve que no está en tiempo de diseño, por lo que los controles de usuario heredados no se muestran en el disñador y en su lugar aparece una excepción...

     

    ¿Alguna idea para solucionar esto? ¿Compilación condicional en base a algún #define?

     

     


    MVP Visual C++ - Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/
    viernes, 8 de julio de 2011 8:57

Respuestas

  • Hola RFOG:

    Lo que comentas que no se puede hacer en visual studio. Se hace de la siguiente forma:

     

    1. En el proyecto de inicio de tu solución pulsas con el boton derecho propiedades y una vez que te aparace la carpeta de propiedades. Pulsas en Depurar, por defecto lo tendras marcado 

    "Proyecto de inicio"

    2. Marca "Programa externo de inicio" y tienes que elegir uno. este es el archivo devenv.exe que no es más que el propio visual studio la ruta donde esta este archivo en mi caso vs2010 es C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe.

     

    3. Después pones los puntos de interrupción que quieras y pulsas F5, cada vez que cambias una propiedad por ejemplo el BackColor y has remplazado esta, veras que puedes depurar.

     

    Respecto a la herencia de controles yo he creado un usercontrol al que le he agregado un checkbox y he cambiado su modificador de acceso a protected. Después he creado un segundo usercontrol que hereda del primero. En este he cambiado propiedades del chekbox y funciona. El problema es que si el modificador de acceso lo pongo a public y el control hijo lo dibujo en un Form, ya no puedo cambiar propiedades del chekbox. Con lo cual la herencia visual esta limitada. Solamente funciona con ciertos modificadores de acceso y siempre por lo que veo en los controles que heredad de el ,pero hasta aquí funciona.

     

    Te paso unos fragmentos de código para que veas lo que he hecho:

     

    Usercontrol1

     public partial class UserControl1 : UserControl
      {
        public UserControl1()
        {
          InitializeComponent();
          if (this.DesignMode)
          {
            base.BackColor = Color.Red;
          }
        }
    
        public override Color BackColor
        {
          get
          {
            return base.BackColor;
          }
          set
          {
            if (DesignMode)
            {
              base.BackColor = Color.Red;
            }
            else
            {
              base.BackColor = value;
            }
          }
        }
        
        
      }
    


    Cambia el Backcolor al que mas te guste:) y veras que siempre en diseño está en Rojo. Agrega a este control un chekbox y cambia el modificar a protected :

    protected System.Windows.Forms.CheckBox checkBox1;

     

    Usercontrol2:

    public partial class UserControl2 : UserControl1

        {

            public UserControl2()

            {

                InitializeComponent();          

     

            }

     

        }

     

    Despúes arrastra el Usercontrol2  a un Formulario y podras hacer lo que te indico.

     

    Saludos.


    phurtado
    viernes, 8 de julio de 2011 10:05
    Moderador

Todas las respuestas

  • Cosas viéredes, amigo Sancho.

    De repente ha empezado a funcionar. He anexado la sesión actual de Visual Studio a otra nueva para depurarla (en C++Builder se podía hacer algo así con los paquetes de diseño, ponías un punto de interrupción y la sesión anterior se paraba ahí y podías mirar qué estaba mal, pero con Visual Studio no funciona)... Estando anexado ha empezado a funcionar.

    Después de eso, he reiniciado el IDE y sigue funcionando con el código de arriba...

    Creo que el problema estaba en que hay que reconstruir la solución después de un cambió así... Eso o tengo que dedicarme a la cría de la Gallina Clueca en lugar de a programar... :-P


    MVP Visual C++ - Visita mi blog sobre desarrollo: http://geeks.ms/blogs/rfog/
    viernes, 8 de julio de 2011 9:20
  • Hola RFOG:

    Lo que comentas que no se puede hacer en visual studio. Se hace de la siguiente forma:

     

    1. En el proyecto de inicio de tu solución pulsas con el boton derecho propiedades y una vez que te aparace la carpeta de propiedades. Pulsas en Depurar, por defecto lo tendras marcado 

    "Proyecto de inicio"

    2. Marca "Programa externo de inicio" y tienes que elegir uno. este es el archivo devenv.exe que no es más que el propio visual studio la ruta donde esta este archivo en mi caso vs2010 es C:\Program Files\Microsoft Visual Studio 10.0\Common7\IDE\devenv.exe.

     

    3. Después pones los puntos de interrupción que quieras y pulsas F5, cada vez que cambias una propiedad por ejemplo el BackColor y has remplazado esta, veras que puedes depurar.

     

    Respecto a la herencia de controles yo he creado un usercontrol al que le he agregado un checkbox y he cambiado su modificador de acceso a protected. Después he creado un segundo usercontrol que hereda del primero. En este he cambiado propiedades del chekbox y funciona. El problema es que si el modificador de acceso lo pongo a public y el control hijo lo dibujo en un Form, ya no puedo cambiar propiedades del chekbox. Con lo cual la herencia visual esta limitada. Solamente funciona con ciertos modificadores de acceso y siempre por lo que veo en los controles que heredad de el ,pero hasta aquí funciona.

     

    Te paso unos fragmentos de código para que veas lo que he hecho:

     

    Usercontrol1

     public partial class UserControl1 : UserControl
      {
        public UserControl1()
        {
          InitializeComponent();
          if (this.DesignMode)
          {
            base.BackColor = Color.Red;
          }
        }
    
        public override Color BackColor
        {
          get
          {
            return base.BackColor;
          }
          set
          {
            if (DesignMode)
            {
              base.BackColor = Color.Red;
            }
            else
            {
              base.BackColor = value;
            }
          }
        }
        
        
      }
    


    Cambia el Backcolor al que mas te guste:) y veras que siempre en diseño está en Rojo. Agrega a este control un chekbox y cambia el modificar a protected :

    protected System.Windows.Forms.CheckBox checkBox1;

     

    Usercontrol2:

    public partial class UserControl2 : UserControl1

        {

            public UserControl2()

            {

                InitializeComponent();          

     

            }

     

        }

     

    Despúes arrastra el Usercontrol2  a un Formulario y podras hacer lo que te indico.

     

    Saludos.


    phurtado
    viernes, 8 de julio de 2011 10:05
    Moderador