none
Como cerrar un usercontrol desde si mismo dentro de un dockpanel ? RRS feed

  • Pregunta

  • Hola amigos, aqui os traigo otra duda, tengo un dockpanel principal en el cual hay una parte central llamada cargaDatos en la cual desde un menu superior del dockpanel va cargando los distintos usercontrols, el problema esta que quiero desde un usercontrol por medio de un boton insertado en el pueda cerrarse a si mismo para cargar otro usercontrol diferente en la misma posicion del dockpanel llamado cargaDatos, pero me he dado cuenta de que la unica manera de poder borrar el usercontrol primero que carga el dockpanel es instanciado al padre y con la propiedad childen.clear y eso no me vale ya que inizializara de nuevo toda la aplicacion?, eso posible lo que digo o debo de cambiar la logica del diseño de capas a diferentes dockpanels y un usercontrol principal ?

    Saludos.

    miércoles, 24 de marzo de 2010 10:39

Respuestas

  • Hola WpfSoft.

    en realidad es un namespace, no se como agregas los userControls directamente en el codigo xaml, pero yo me creo namespaces para acceder a controles del mismo u otros ensamblados, de forma que:

    <Window x:Class="WpfApplication1.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication1"
        Title="Window1" Height="430" Width="461">
        <Grid>
            
        </Grid>
    </Window>

    En la linea xmlns:local="blablabla.." estoy definiendo un nombre de espacio llamado local mediante el cual se puede acceder a los controles que le asignes, en este caso apunta al mismo ensamblado por eso lo llamo "local", pero puedes poner el nombre que quieras y apuntar al ensamblado que quieras, de forma que puedas hacer algo como esto:

    <namespace:control></namespace:control>

    y puedas insertar controles en el codigo xaml y de paso tenerlos ordenados por nombres de espacio.

     

     

     


    Saludos
    David González
    • Marcado como respuesta WpfSoft domingo, 4 de abril de 2010 9:31
    • Marcado como respuesta WpfSoft domingo, 4 de abril de 2010 9:31
    viernes, 26 de marzo de 2010 13:44

Todas las respuestas

  • Hola WpfSoft

    Creo que no te he entendido bien, pero algo como esto inserta o elimina controles dentro de un contenedor en un indice dado que se puede obtener por varios metodos:

                dockPanel1.Children.RemoveAt(0);
                //dockPanel1.Children.Add(new UserControl2());
                dockPanel1.Children.Insert(0, new UserControl2());

     

    En cualquier caso siempre se puede realizar de esta forma con un buen diseño.

     


    Saludos
    David González
    miércoles, 24 de marzo de 2010 20:11
  • Hola David, perdon por no explicame bien, estoy aplicando en aplicacion un diseño basado en modelo, vista, y controlador, el tema esta en que he creado un usercontrol principal con un dockpanel llamado cargaFormularios, este se carga en la parte central , este es el encargado de cargar otros usercontrols dentro de se dockpanel llamado cargaFormulario, el problema lo tengo que no se como limpiar cargaFormularios  desde un usercontrol cargado ya en el, voy a escribirte un pequeño ejemplo.

    VistaPadre ( PANTALLA PRINCIPAL ) --> CARGA UN USERCONTROL LLAMADO vistaPrincipal (ESTE USERCONTROL ESTA DENTO DE UNA CARPETA LLAMADA VISTAS ) --> CARGA AL INICIAR UN USERCONTROL LLAMADO -->Profesores ( ESTE USERCONTROL ESTA DENTO DE UNA CARPETA LLAMADA VISTAS ) -->PULSAMOS UN BOTON QUE SE ENCUENTRA DENTRO DE ESTE USERCONTROL QUE TIENE POR MISION LLAMAR AL DOCKPANEL CON NOMBRE  cargaFormularios ( EL DOCKPANEL SE ENCUENTRA EN EL USERCONTROL vistaPrincipal ) Y BORRAR EL USERCONTROL CARGADO EN EL , EN ESTE CASO SERIA Profesores Y CARGAR UN NUEVO USERCONTROL CON NOMBRE alumnos EL CUAL YA ABRA ENVIADO UNOS PARAMETROS DESDE EL USERCONTROL Profesores al alumnos.

    PROBLEMA : No se como llamar al dockpanel cargaFormularios sin tener que instanciar una nueva clase vistaPrincipal, David me gustaria que me expongan algunos ejemplos de intercambio de parametros entre usercontrols que se encuentren a distintos niveles.

    Este es el codigo que utilizo y no me vale, esta en el usercontrol alumnos.

    private void cargarFormularioAlumnos(object sender, RoutedEventArgs e)
            {
                vistaPrincipal vP = new vistaPrincipal();
                vP.CargadorVistaPrincipal.Children.Clear();
                vP.CargadorVistaPrincipal.Children.Add(new vistaalumnos());
    
            }

    Saludos y muchas gracias.

    jueves, 25 de marzo de 2010 11:25
  • Hola WpfSoft.

    Creo que ya se lo quieres realizar, a ver si es algo como esto:

    1.- tenemos la aplicacion principal, "VistaPadre" que tiene un grid y dentro del grid un userControl con un DockPanel (o cualquier otro contenedor) que sera el que contenga los diferentes UserControls, de modo que en la vista padre podemos tener algo como esto:

     

        <Grid Name="mainGrid">
            <local:VistaPrincipal></local:VistaPrincipal>
        </Grid>

     

    De modo que tenemos la ventana principal con un grid y dentro un UserControl llamado VistaPrincipal que tiene solo un DockPanel (puede tener mas cosas).

    Al cargar el UserControl "VistaPrincipal" se cargara un primer control de usuario, por ejemplo Profesores:

    codigo .cs del UserControl "VistaPrincipal":

     

            private void UserControl_Loaded(object sender, RoutedEventArgs e)
            {
                mainDock.Children.Add(new Profesores());
            }

     

    "mainDock" es el nombre del DockPanel que contiene el UserControl.

    Se puede ver que solo cargamos el User control Profesores al cargarse.

    Ahora vienen los Usercontrols que seran los que se vayan intercambiando. Para este ejemplo he puesto un boton en ambos UserControls (Profesores y Alumnos) de modo que al pulsarlo se vayan alternando.

    En el evento click del boton para el UserControl Profesores podemos poner algo como esto:

     

            private void button1_Click(object sender, RoutedEventArgs e)
            {
                DockPanel container = (DockPanel)this.Parent;
                container.Children.Insert(0, new Alumnos());
                container.Children.Remove(this);
            }

     

    Se puede ver como se obtiene el contenedor padre (en nuestro caso, el DockPanel de VistaPrincipal), se inserta el nuevo UserControl "Alumnos" en el indice 0 y luego se elimina este mismo (el UserControl Profesores).

    Y en el UserControl Alumnos, deberemos realizar lo contrario:

     

            private void button1_Click(object sender, RoutedEventArgs e)
            {
                DockPanel container = (DockPanel)this.Parent;
                container.Children.Insert(0, new Profesores());
                container.Children.Remove(this);
            }

     

    Se crea el UserControl Profesores insertandolo en el indice 0 y luego se elimina este misno (el UserControl Alumnos).

     

    Creo que es algo asi lo que quieres realizar ¿no?.

     


    Saludos
    David González
    jueves, 25 de marzo de 2010 20:25
  • Hola David, me has cogido la idea funciona perfectamente, solo una cosa no entiendo, es el codigo qu eesta dentro del grid maingrid, me refiero a local
     <
    local
    :
    VistaPrincipal
    >
    </
    local
    :
    VistaPrincipal
    >
    

    No me aparece en mi codigo, parece ser que me faltal una directiva using?

    Saludos y muchas gracias.
    viernes, 26 de marzo de 2010 10:00
  • Hola WpfSoft.

    en realidad es un namespace, no se como agregas los userControls directamente en el codigo xaml, pero yo me creo namespaces para acceder a controles del mismo u otros ensamblados, de forma que:

    <Window x:Class="WpfApplication1.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication1"
        Title="Window1" Height="430" Width="461">
        <Grid>
            
        </Grid>
    </Window>

    En la linea xmlns:local="blablabla.." estoy definiendo un nombre de espacio llamado local mediante el cual se puede acceder a los controles que le asignes, en este caso apunta al mismo ensamblado por eso lo llamo "local", pero puedes poner el nombre que quieras y apuntar al ensamblado que quieras, de forma que puedas hacer algo como esto:

    <namespace:control></namespace:control>

    y puedas insertar controles en el codigo xaml y de paso tenerlos ordenados por nombres de espacio.

     

     

     


    Saludos
    David González
    • Marcado como respuesta WpfSoft domingo, 4 de abril de 2010 9:31
    • Marcado como respuesta WpfSoft domingo, 4 de abril de 2010 9:31
    viernes, 26 de marzo de 2010 13:44