none
WPF- C# - Expander RRS feed

  • Pregunta

  • Hola, quisiera saber si alguien me puede ayudar con el control expander de WPF en C#

    1. Tengo 4 Expander
    2.Necesito que cuando yo expanda 1 cualquiera, los otros Colapsen, ejemplos por favor


    Gracias, a todos.....
    Novato
    sábado, 7 de marzo de 2009 23:09

Respuestas

  • Hola,

    La verdad se poco de WPF, pero se me ocurre que podrias hacer uso del evento Expander.Expanded (Evento)

    por supuesto deberias asignarle a este evento el mismo metodo.

    cuando el evento se lanza tu usarias el sender para saber cual lo envio y por lo tanto hacer un foreach por todos lo controles del tipo expender y le asignas la propiedad Expander.IsExpanded (Propiedad), en false, a todos los controles menos al que lanzo el evento.

    No se que te parece, deberia funcionar, aunque no se que tan performante sea.


    Por ahi algo que veo que habria que analizar, es si al cambiar la propiedad IsExpandable=false, al resto de los controles no te vuelve a lanzar el mismo evento.

    por ahi habria que asignar y desasignar el handler del evento una vez que entre y asignarlo cuando termina, usando el tipico:

      -= new System.EventHandler()
     += new System.EventHandler()

    tambien tendrias que preguntar ni bien entre al evento como se encuentra el control que envia el evento, ya que solo si esta se va a expendiar deberias colapsar al resto, este evento se lanza ya sea si expandes como al colpasar.


    bueno espero se entienda, y sea util
    Saludos


    Leandro Tuttini
    sábado, 7 de marzo de 2009 23:58
  • Hola,

    Si en realidad lo que yo sugeria es usar solo un metodo de evento, o sea:

    en el load del formulario podrias asignar los eventos :

    Expander1.Expanded += new EventHandler(Expander_expanded);
    Expander2.Expanded += new EventHandler(Expander_expanded);
    Expander3.Expanded += new EventHandler(Expander_expanded);
    .
    .

    luego el metodo seria algo como:

    public void Expander_expanded(Object sender, """""" e) 
        Expander controlExpanded = sender as Expander; 
     
        if(controlExpanded != null
        { 
           if(controlExpanded.IsExpande = true
           { 
              //quitas el evento, para que cuando lo cambies desde codigo no se vuelva a lanzar, 
              //esta parte deberias investigarla, para ver si 
              // asignar un valor a la propiedad IsExpende, lanza el evento, sino lo lanza esta parte no hace falta. 
              Expander1.Expanded -= new EventHandler(Expander_expanded); 
              Expander2.Expanded -= new EventHandler(Expander_expanded); 
              Expander3.Expanded -= new EventHandler(Expander_expanded); 
              . 
              . 
              
              foreach(Control item in this.Controls) //el this en este caso es tu formulario 
              { 
                 if(!(item is Expander)) 
                    continue
     
                 if(item.name != controlExpanded.name) //aqui tal vez podrias comparar por alguna otra porpiedad 
                     item.IsExpande = false
              } 
     
              Expander1.Expanded += new EventHandler(Expander_expanded); 
              Expander2.Expanded += new EventHandler(Expander_expanded); 
              Expander3.Expanded += new EventHandler(Expander_expanded); 
              . 
              . 
     
           } 
        } 



    Creo que seria algo de esta forma, como veras lo escribi directo en el post por lo que deberas validad sino cometi ningun error, pero creo que servira para que veas cual era la idea.

    Por ahi en el evento en lugar de hacer:

              Expander1.Expanded -= new EventHandler(Expander_expanded);
              Expander2.Expanded -= new EventHandler(Expander_expanded);
              Expander3.Expanded -= new EventHandler(Expander_expanded);
              .
              .

    Si sabes que todos los controles Expender se comportaran igual podrias usar el foreach tambien aqui, algo como:

              foreach(Control item in this.Controls) 
              { 
                 if(!(item is Expander)) 
                    continue
                 
                 item.Expanded += new EventHandler(Expander_expanded); 
     
              } 



    como veras recorrer todos los controles Expender y le asigna el evento, para quitarselo tambien funcionaria, solo basta con cambiar de signo.


    bueno espero te sea de utilidad.
    Saludos


    Leandro Tuttini
    domingo, 8 de marzo de 2009 3:25

Todas las respuestas

  • Hola,

    La verdad se poco de WPF, pero se me ocurre que podrias hacer uso del evento Expander.Expanded (Evento)

    por supuesto deberias asignarle a este evento el mismo metodo.

    cuando el evento se lanza tu usarias el sender para saber cual lo envio y por lo tanto hacer un foreach por todos lo controles del tipo expender y le asignas la propiedad Expander.IsExpanded (Propiedad), en false, a todos los controles menos al que lanzo el evento.

    No se que te parece, deberia funcionar, aunque no se que tan performante sea.


    Por ahi algo que veo que habria que analizar, es si al cambiar la propiedad IsExpandable=false, al resto de los controles no te vuelve a lanzar el mismo evento.

    por ahi habria que asignar y desasignar el handler del evento una vez que entre y asignarlo cuando termina, usando el tipico:

      -= new System.EventHandler()
     += new System.EventHandler()

    tambien tendrias que preguntar ni bien entre al evento como se encuentra el control que envia el evento, ya que solo si esta se va a expendiar deberias colapsar al resto, este evento se lanza ya sea si expandes como al colpasar.


    bueno espero se entienda, y sea util
    Saludos


    Leandro Tuttini
    sábado, 7 de marzo de 2009 23:58
  • Hola y gracias por tu ayuda, es muy importante...

    mira yo logre hacer lo que tu dices pues cuando ocurra el evento Expander1_expanded entonces yo decia que me asignara a los otros false, pero luego se quendan pegados con esa propiedad(IsExpanded) en false


    es decir :


    public void Expander1_expanded(Object sender, """""" e)
    {
        expander2.IsExpande = false;
        ...
        ...
        ...
    }
    public void Expander1_expanded("""""""""")
    {
        Expanded2.IsExpanded = true;
        ...
        ...
        ...
    }

    La verdad soy un novato completo y no se como manejr los eventos, ayuda por fa....

    Novato
    domingo, 8 de marzo de 2009 0:30
  • Hola,

    Si en realidad lo que yo sugeria es usar solo un metodo de evento, o sea:

    en el load del formulario podrias asignar los eventos :

    Expander1.Expanded += new EventHandler(Expander_expanded);
    Expander2.Expanded += new EventHandler(Expander_expanded);
    Expander3.Expanded += new EventHandler(Expander_expanded);
    .
    .

    luego el metodo seria algo como:

    public void Expander_expanded(Object sender, """""" e) 
        Expander controlExpanded = sender as Expander; 
     
        if(controlExpanded != null
        { 
           if(controlExpanded.IsExpande = true
           { 
              //quitas el evento, para que cuando lo cambies desde codigo no se vuelva a lanzar, 
              //esta parte deberias investigarla, para ver si 
              // asignar un valor a la propiedad IsExpende, lanza el evento, sino lo lanza esta parte no hace falta. 
              Expander1.Expanded -= new EventHandler(Expander_expanded); 
              Expander2.Expanded -= new EventHandler(Expander_expanded); 
              Expander3.Expanded -= new EventHandler(Expander_expanded); 
              . 
              . 
              
              foreach(Control item in this.Controls) //el this en este caso es tu formulario 
              { 
                 if(!(item is Expander)) 
                    continue
     
                 if(item.name != controlExpanded.name) //aqui tal vez podrias comparar por alguna otra porpiedad 
                     item.IsExpande = false
              } 
     
              Expander1.Expanded += new EventHandler(Expander_expanded); 
              Expander2.Expanded += new EventHandler(Expander_expanded); 
              Expander3.Expanded += new EventHandler(Expander_expanded); 
              . 
              . 
     
           } 
        } 



    Creo que seria algo de esta forma, como veras lo escribi directo en el post por lo que deberas validad sino cometi ningun error, pero creo que servira para que veas cual era la idea.

    Por ahi en el evento en lugar de hacer:

              Expander1.Expanded -= new EventHandler(Expander_expanded);
              Expander2.Expanded -= new EventHandler(Expander_expanded);
              Expander3.Expanded -= new EventHandler(Expander_expanded);
              .
              .

    Si sabes que todos los controles Expender se comportaran igual podrias usar el foreach tambien aqui, algo como:

              foreach(Control item in this.Controls) 
              { 
                 if(!(item is Expander)) 
                    continue
                 
                 item.Expanded += new EventHandler(Expander_expanded); 
     
              } 



    como veras recorrer todos los controles Expender y le asigna el evento, para quitarselo tambien funcionaria, solo basta con cambiar de signo.


    bueno espero te sea de utilidad.
    Saludos


    Leandro Tuttini
    domingo, 8 de marzo de 2009 3:25