none
Cargar UserControl Dinamicamente RRS feed

  • Pregunta

  • amigos acabo de entrar con WPF y ahora lo que deseo es.
    Tengo la ventana principal y en sobre ella deseo cargar los UserControl que diseñe(login,formularios,etc) pero en el mismo y asi tener una ventana central y los usercontrol solo se cargaran cuando los llame y necesite. y asi hacerlos mas animado y dinamica la aplicacion.
    espero que me hayan entendido si alguien tiene informacion de como podria hacerla le quedare muy agradecido gracias.
    miércoles, 9 de diciembre de 2009 0:02

Respuestas

  • Hola de nuevo Lord.

    El metodo que te he pasado sirve para insertar tantos CustomControls como quieras, tan solo tienes que establecer tantos grid como desees en las zonas requeridas (hablo de grids, pero puede ser cualquier otro contenedor como stacksPanels incluso canvas).

    La idea es la de tener tantos contenedores como quieras e ir añadiendo en ellos los CustomControls, Si quieres usar un DockPanel,puedes usarlo si quieres. Solo quiero que entiendas el concepto, el de insertar contenedores donde quieras insertar los customControls e ir cambiandolos al gusto.

    Por ejemplo, aqui te dejo un codigo con Un dockPanel y stackPanels:


    <Window x:Class="WpfApplication1.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="396" Width="591">
        
        <DockPanel LastChildFill="True">
            <StackPanel Name="stackPanel1" DockPanel.Dock="Left" Width="120" />
            <StackPanel Name="stackPanel2" DockPanel.Dock="Top"  Height="80" />
            <StackPanel Name="stackPanel3" />
        </DockPanel>
        
    </Window>
    en este caso tienes las 3 areas que comentas, y en ninguna hay nada.

    Para insertar un Custom control en cualquier StackPanel, recurrimos al codigo del primer post:
    (en este caso lo añadimos al StackPanel3)

    // Limpiar el area cliente para insertar un CustomControl
    stackPanel3.Children.Clear();
    
    // Añadir el CustomControl
    stackPanel3.Children.Add(new UserControl1());
    y como este, se puede realizar multitud de variaciones, pero la idea es la misma.


    NOTAS: si por ejemplo quisieras que el stackPanel3 ocupase toda el area tan solo tienes que establecer las dimensiones de los otros 2 a '0':

    <DockPanel LastChildFill="True">
        <StackPanel Name="stackPanel1" DockPanel.Dock="Left" Width="0" />
        <StackPanel Name="stackPanel2" DockPanel.Dock="Top"  Height="0" />
        <StackPanel Name="stackPanel3" />
    </DockPanel>
    Se puede jugar con las dimensiones de los contenedores para hacerlo mas interactivo, incluso con animaciones para ver como se ocultan paneles, etc. (aqui ya depende de la imaginacion ;)

    Si tienes algun problema comentalo.













    Saludos
    David González
    jueves, 10 de diciembre de 2009 7:54

Todas las respuestas

  • Hola Lord.

    Esa es una buena idea, sobretodo para evitar repetir mucho codigo y reusar los marcos.

    Bueno, esto lo puedes realizar como siempre, de muchas formas y dependiendo del control que sea tu marco. Asi que te explico como lo hago yo para que te sirva como base.

    Yo creo una ventana principal que sera en la que se vayan alternando los diferentes controles de usuario de modo que siempre se usa la misma ventana para todas las funcionalidades.

    Para el contenedor donde inserto los diferentes controles establezco un grid como en el siguiente codigo:

    <!-- Grid que contiene el area cliente de la ventana -->
    <Grid  Height="Auto" x:Name="grid_areaClient" Width="Auto" Margin="0">                       
        <!-- Control de usuario inicial -->
        <MiNamespace:MiControlUsuario/>
    </Grid>
    en este grid sera donde se iran insertando los diferentes controles de usuario con diferentes formularios (o lo que se desee).

    Ahora para cambiar el control de usuario del grid por otro, yo lo que hago es: limpiar el grid y añadir el nuevo control de usuario

    // Limpiar el area cliente para cambiar a la vista principal
    grid_areaClient.Children.Clear();
    
    // Añadir la nueva vista
    grid_areaClient.Children.Add(new MiControlUsuario());

    Esto lo puedes hacer en tantos grids como quieras.

    Ya me contaras que tal te ha ido










    Saludos
    David González
    miércoles, 9 de diciembre de 2009 8:09
  • muy buen aporte.. :D pero hay una pequeña consideracion :$ que hay momentos que no solo tendremos un user control en una determinada area, me explico ayer estuve buscando una solucion y la mas correcta me parecio usar el DockGrid. ya que divide la aplicacion en sectores, top botton, left rigth , y center bueno lo que quisera es cargar un ejemplo primero el Login en centro luego una vez validado los datos pues mostrar otro menu en la izquierda y luego en el centro otra vez un formulario claro sin tener que descargar el menu de la izquierda y asi meter cuantos usercontrols hechos por mi que desee.. pero lo que me cuesta entender como se podria realizar eso.. :$ no tengo tanta experiencia.. pero ando investigando.. gracias por tu ayuda...... :D tienes mi mail para cualquier cosa fer_bolivia@hotmail.com
    miércoles, 9 de diciembre de 2009 13:19
  • Hola de nuevo Lord.

    El metodo que te he pasado sirve para insertar tantos CustomControls como quieras, tan solo tienes que establecer tantos grid como desees en las zonas requeridas (hablo de grids, pero puede ser cualquier otro contenedor como stacksPanels incluso canvas).

    La idea es la de tener tantos contenedores como quieras e ir añadiendo en ellos los CustomControls, Si quieres usar un DockPanel,puedes usarlo si quieres. Solo quiero que entiendas el concepto, el de insertar contenedores donde quieras insertar los customControls e ir cambiandolos al gusto.

    Por ejemplo, aqui te dejo un codigo con Un dockPanel y stackPanels:


    <Window x:Class="WpfApplication1.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="396" Width="591">
        
        <DockPanel LastChildFill="True">
            <StackPanel Name="stackPanel1" DockPanel.Dock="Left" Width="120" />
            <StackPanel Name="stackPanel2" DockPanel.Dock="Top"  Height="80" />
            <StackPanel Name="stackPanel3" />
        </DockPanel>
        
    </Window>
    en este caso tienes las 3 areas que comentas, y en ninguna hay nada.

    Para insertar un Custom control en cualquier StackPanel, recurrimos al codigo del primer post:
    (en este caso lo añadimos al StackPanel3)

    // Limpiar el area cliente para insertar un CustomControl
    stackPanel3.Children.Clear();
    
    // Añadir el CustomControl
    stackPanel3.Children.Add(new UserControl1());
    y como este, se puede realizar multitud de variaciones, pero la idea es la misma.


    NOTAS: si por ejemplo quisieras que el stackPanel3 ocupase toda el area tan solo tienes que establecer las dimensiones de los otros 2 a '0':

    <DockPanel LastChildFill="True">
        <StackPanel Name="stackPanel1" DockPanel.Dock="Left" Width="0" />
        <StackPanel Name="stackPanel2" DockPanel.Dock="Top"  Height="0" />
        <StackPanel Name="stackPanel3" />
    </DockPanel>
    Se puede jugar con las dimensiones de los contenedores para hacerlo mas interactivo, incluso con animaciones para ver como se ocultan paneles, etc. (aqui ya depende de la imaginacion ;)

    Si tienes algun problema comentalo.













    Saludos
    David González
    jueves, 10 de diciembre de 2009 7:54
  • pues millon de gracias por las ayudas prestadas ya entendi el concepto ahora con eso solo resta diseñar los controles y bueno darle una interfaz mas amigable con WPF y Expression Blend que uso ahora para diseñar la interfaz. bueno quedo muy agradecido y si puedes añadirme al msn mejor :D
    jueves, 10 de diciembre de 2009 13:39
  • Hola de nuevo Lord.

    El metodo que te he pasado sirve para insertar tantos CustomControls como quieras, tan solo tienes que establecer tantos grid como desees en las zonas requeridas (hablo de grids, pero puede ser cualquier otro contenedor como stacksPanels incluso canvas).

    La idea es la de tener tantos contenedores como quieras e ir añadiendo en ellos los CustomControls, Si quieres usar un DockPanel,puedes usarlo si quieres. Solo quiero que entiendas el concepto, el de insertar contenedores donde quieras insertar los customControls e ir cambiandolos al gusto.

    Por ejemplo, aqui te dejo un codigo con Un dockPanel y stackPanels:


    <DockPanel LastChildFill="True">
        <StackPanel Name="stackPanel1" DockPanel.Dock="Left" Width="0" />
        <StackPanel Name="stackPanel2" DockPanel.Dock="Top"  Height="0" />
        <StackPanel Name="stackPanel3" />
    </DockPanel>
    
    Se puede jugar con las dimensiones de los contenedores para hacerlo mas interactivo, incluso con animaciones para ver como se ocultan paneles, etc. (aqui ya depende de la imaginacion ;)

    Si tienes algun problema comentalo.













    Saludos
    David González

         Hola, y disculpa por entrometerme, pero necesito ayuda, la forma que explicas me funciono para una app que estoy haciendo, solo queria hacer una pregunta, ¿Existe alguna manera de que no te borre los datos que ya has escrito en un UserControl que tenga textboxes?, porque cuando abro una me muestra todo nomal, escribo datos, pero cuando paso abrir otro usercontrol, y vuelvo al que abri anteriormente, me borra los datos que ya había escrito.

    Existe alguna manera de controlar esto?, gracias, espero me entiendas.

    domingo, 2 de diciembre de 2012 19:22