none
Eventos Enrutados RRS feed

  • Pregunta

  • Holas amigos aun no entiendo el como usar estos eventos, y cuando se usan exactamente..!!! y cuando es preferible usar los eventos normal que todos queremos y usamos.. :P je.jej.ej. en fin quisiera un poco mas de referencia del tema gracias.. :D
    pd.- mejor si se explicarian con sus propias palabras para entender mejor la situacion ok gracias de antemano. .:D
    miércoles, 17 de marzo de 2010 14:50

Respuestas

  • Los RoutedEvents son eventos que se pasan de padre a hijo o de hijo a padre. Esto se conoce como Tunneling o Bubbling. Los eventos que hacen tunneling el evento se captura en algun padre del control y se va bajando hasta el control. Los indentificas facilmente, porque el nombre comienza con Preview y tiene un par que se llama igual pero sin preview. La idea de este modelo de eventos, es que vos puedas poner el código donde más te convenga para no tener que reescribirlo.
    Por ejemplo si tenes un Button en una toolbar y un Button que hace lo mismo en tu pantalla, por ejemplo un print. Si usas los eventos comunes tenes que manejar los eventos de los 2 botones por separado, mas allá que hagas un método en común y llames a ese método. Usando routed events, podes manejar el click del botón del toolbar y el del botón que tenes dentro del form, en su control contenedor, de esta forma, tenes un solo EventHandler que esta capturando el evento y dandole su lógica.
    A diferencia de los eventos comunes, no podes guiarte con el sender para saber quien lo fue quien dió origen al evento, porque en el sender te va a salir desde donde fue capturado, para saber quien lo disparó tenes que buscar en la propiedad source del RoutedEventHander.

    Espero que esta información te sea de utilidad. Hace unos días que estoy pensando en preparar un articulo en mi blog sobre esto, así que estate atento, por ahí te pueda aclarar más cosas.

    Saludos,
    Sandro D. Garcia
    Colabora con el foro: Si este mensaje te es de utilidad marcalo como respuesta.
    -----
    Please, if this message helps you, remember mark it as response, may be can help more people with same problem.
    -----
    Mi Blog
    miércoles, 17 de marzo de 2010 17:37

Todas las respuestas

  • Los RoutedEvents son eventos que se pasan de padre a hijo o de hijo a padre. Esto se conoce como Tunneling o Bubbling. Los eventos que hacen tunneling el evento se captura en algun padre del control y se va bajando hasta el control. Los indentificas facilmente, porque el nombre comienza con Preview y tiene un par que se llama igual pero sin preview. La idea de este modelo de eventos, es que vos puedas poner el código donde más te convenga para no tener que reescribirlo.
    Por ejemplo si tenes un Button en una toolbar y un Button que hace lo mismo en tu pantalla, por ejemplo un print. Si usas los eventos comunes tenes que manejar los eventos de los 2 botones por separado, mas allá que hagas un método en común y llames a ese método. Usando routed events, podes manejar el click del botón del toolbar y el del botón que tenes dentro del form, en su control contenedor, de esta forma, tenes un solo EventHandler que esta capturando el evento y dandole su lógica.
    A diferencia de los eventos comunes, no podes guiarte con el sender para saber quien lo fue quien dió origen al evento, porque en el sender te va a salir desde donde fue capturado, para saber quien lo disparó tenes que buscar en la propiedad source del RoutedEventHander.

    Espero que esta información te sea de utilidad. Hace unos días que estoy pensando en preparar un articulo en mi blog sobre esto, así que estate atento, por ahí te pueda aclarar más cosas.

    Saludos,
    Sandro D. Garcia
    Colabora con el foro: Si este mensaje te es de utilidad marcalo como respuesta.
    -----
    Please, if this message helps you, remember mark it as response, may be can help more people with same problem.
    -----
    Mi Blog
    miércoles, 17 de marzo de 2010 17:37
  • millon de gracias..:D bueno hice un poco de codigo con eso ..... y ahora tengo algunas preguntas..:D solo puede enviar RoutedEventArgs ????  no se podria enviar un Objeto y asi en la clase reciba un Objeto y no el RoutedEventArgs e gracias... valiosa la informacion que me diste..!!
    miércoles, 17 de marzo de 2010 20:54
  • Desde tus objetos si vas a lanzar RoutedEvents, tenes que pasar RoutedEventArgs. Ahora si necesitas enviar un objeto, aparte de los que ya se pasan en los RoutedEventsArgs, lo que podes hacer es una clase personalizada que herede de RoutedEventsArgs y ahí agregas lo que necesitas, entonces cuando vas a disparar el evento, en vez de pasar un RoutedEvent, pasas tu Clase personalizada que hereda de RoutedEventsArgs.
    Sería algo así:

        public class RoutedEventsPersonal : RoutedEventArgs
        {
            public Object ObjectProperty { get; set; }
        }
    Saludos,



    Sandro D. Garcia
    Colabora con el foro: Si este mensaje te es de utilidad marcalo como respuesta.
    -----
    Please, if this message helps you, remember mark it as response, may be can help more people with same problem.
    -----
    Mi Blog
  •  public class RoutedEventsPersonal : RoutedEventArgs
        {
            public USUARIO ObjectProperty { get; set; }
        }
    

    se podria de esta manera tambien.. ????  suponiendo que USUARIO es una clase ya creada.. :D

    pd.- gracias por la ayuda. .:D

    viernes, 19 de marzo de 2010 14:08
  • Si, claro. Yo te puse un Object  para hacerlo genérico, pero esa property puede ser del tipo que quieras. Incluso podes poner más propiedades.
    Sandro D. Garcia
    Colabora con el foro: Si este mensaje te es de utilidad marcalo como respuesta.
    -----
    Please, if this message helps you, remember mark it as response, may be can help more people with same problem.
    -----
    Mi Blog
  • este en el Login.xaml.cs

     public delegate void myUsuario(USUARIO usuario);
    
            public static readonly RoutedEvent enviarUsuario = EventManager.RegisterRoutedEvent("sendUsuario", RoutingStrategy.Bubble, typeof(RoutedEventArgs), typeof(Login.myUsuario));
            public event RoutedEventHandler sendUsuario
            {
                add { AddHandler(enviarUsuario, value); }
                remove { RemoveHandler(enviarUsuario, value); }
            }
    
     private void btn_aceptar_Click(object sender, RoutedEventArgs e)
               {
                . . . .. 
                    RoutedEventArgs evento = new RoutedEventArgs(enviarUsuario);
                    RaiseEvent(evento);
                }

    y este el el window.xaml.cs

     

    private void Ulogin_sendUsuario(object sender, RoutedEventArgs e)
            {
               //aca se recibe todo pero lo que deseo es recibir en lugar de 
    // object sender, RoutedEventArgs e recibir USUARIO currentUser
    }

     

    y en window.xaml tengo...

     

    <Grid x:Name="grid_center" Margin="90,69,90,22" Background="#3300385B">
                <local:Login x:Name="Ulogin" Margin="94,113,95,123" sendUsuario="Ulogin_sendUsuario"/>
            </Grid>
    gracias.. :D aun voy aplicando lo que me respondieron y viendo como meterlo gracias. :D

     

    viernes, 19 de marzo de 2010 14:23
  • Ojo con esta línea:

     private void btn_aceptar_Click(object sender, RoutedEventArgs e)
               {
                . . . .. 
                    RoutedEventArgs evento = new RoutedEventArgs(enviarUsuario);
                    RaiseEvent(evento);
                }
    
    Ahí estas pasando un RoutedEventArgs, ahí tendrías que crear un EventArg de tu tipo personalizado.

     


    Sandro D. Garcia
    Colabora con el foro: Si este mensaje te es de utilidad marcalo como respuesta.
    -----
    Please, if this message helps you, remember mark it as response, may be can help more people with same problem.
    -----
    Mi Blog
  • mmmm.. asi quedo pero aun creo que me equivo en algo

     

     public class RoutedPersonal : RoutedEventArgs
        {
            public RoutedPersonal()
            {
    
            }
            public USUARIO RoutedProperty
            {
                get;
                set;
            }
        }
     private void btn_aceptar_Click(object sender, RoutedEventArgs e)
            {
                //.....
                    RoutedPersonal evento = new RoutedPersonal();
                    evento.RoutedProperty = usuarioActual;
                    RaiseEvent(evento);
            }

    y en el window hice

    private void Ulogin_sendUsuario(USUARIO current)
            {
                usuario_actual = current;
            }
    pero no me acepta.. :(   me podrias aclarar un poco el panorama.. :D

     

    viernes, 19 de marzo de 2010 14:59
  • Esto esta mal:

    private
     void
     Ulogin_sendUsuario(USUARIO current)
    {
    usuario_actual = current;
    }

    Aca vas a recibir siemre un evento y el sender. La diferencia que en vez de recibir un RoutedEventArg, vas a recibir RoutedPersonal, de ese e podes obtener el usuario que le pasaste.

    private
     void
     Ulogin_sendUsuario(object
     sender, RoutedPersonal e)
    {
    //aca desde el e.RoutedProperty obtenes tu usuario
    usuario_actual = e.RoutedProperty;
    }

    Sandro D. Garcia
    Colabora con el foro: Si este mensaje te es de utilidad marcalo como respuesta.
    -----
    Please, if this message helps you, remember mark it as response, may be can help more people with same problem.
    -----
    Mi Blog
  • aca me sale error ahora al compilar..

    <local:Login x:Name="Ulogin" Margin="94,113,95,123" sendUsuario="Ulogin_sendUsuario"/>

    y este es el error

    y este es el error

    El valor 'Ulogin_sendUsuario' no se puede asignar a la propiedad 'sendUsuario' del objeto 'watts.Login'. Error al enlazar con el método de destino.  Error en el objeto 'Ulogin' en el archivo de marcado 'watts;component/window1.xaml' Línea 15 Posición 65.

    si cambio de

    private void Ulogin_sendUsuario(object sender, RoutedEventArgs e)
            {
    
            }

    a

    private void Ulogin_sendUsuario(object sender, RoutedPersonal e)
            {
    
            }

    me pregunto si aca tambien debo cambiarlo.. ?

    public delegate void myUsuario(USUARIO usuario);
    
            public static readonly RoutedEvent enviarUsuario = EventManager.RegisterRoutedEvent("sendUsuario", RoutingStrategy.Bubble, typeof(RoutedEventArgs), typeof(Login.myUsuario));

    POR

    public delegate void myUsuario(USUARIO usuario);
    
            public static readonly RoutedEvent enviarUsuario = EventManager.RegisterRoutedEvent("sendUsuario", RoutingStrategy.Bubble, typeof(RoutedPersonal), typeof(Login.myUsuario));
    nuevamente gracias por tu tiempo disculpa si son errores basicos pero recien empiezo con estos eventos gracias.. :D


    J. Fernando Galvez V. e-mail : fer_bolivia@hotmail.com skype : karnash
    viernes, 19 de marzo de 2010 16:14
  • Si deberías. Mostrame el código donde creas el evento en tu control login.
    Sandro D. Garcia
    Colabora con el foro: Si este mensaje te es de utilidad marcalo como respuesta.
    -----
    Please, if this message helps you, remember mark it as response, may be can help more people with same problem.
    -----
    Mi Blog

  • namespace xxx { /// <summary> /// Interaction logic for Login.xaml /// </summary> public partial class Login : UserControl { USUARIO usuarioActual = new USUARIO(); public delegate void myUsuario(USUARIO usuario); public static readonly RoutedEvent enviarUsuario = EventManager.RegisterRoutedEvent("sendUsuario", RoutingStrategy.Bubble, typeof(RoutedEventArgs), typeof(Login.myUsuario)); public event RoutedEventHandler sendUsuario { add { AddHandler(enviarUsuario, value); } remove { RemoveHandler(enviarUsuario, value); } }

    weno ahi cargo el event enrutado..

    y lo disparon con

     private void btn_aceptar_Click(object sender, RoutedEventArgs e)
            {
              
                    //enviamos el usuario actual al main
                    RoutedPersonal evento = new RoutedPersonal();
                    evento.RoutedProperty = usuarioActual;
                    RaiseEvent(evento);
                }

    obviamente que ya me cree la clase

     public class RoutedPersonal : RoutedEventArgs
        {
            public RoutedPersonal()
            {
    
            }
            public USUARIO RoutedProperty
            {
                get;
                set;
            }
        }
    millon de gracias.. :D por tu tiempo


    J. Fernando Galvez V. e-mail : fer_bolivia@hotmail.com skype : karnash
    viernes, 19 de marzo de 2010 19:43
  • Fijate si te sirve este ejemplo y adaptalo con tu clase Usuario:

    Codebehind del control

    namespace WpfApplication1
    {
        /// <summary>
        /// Interaction logic for Login.xaml
        /// </summary>
        public partial class Login : UserControl
        {
           
            // Create a custom routed event by first registering a RoutedEventID
            // This event uses the bubbling routing strategy
            public static RoutedEvent ClickEvent;
            private delegate EventHandler<RoutedEventsArgsPersonal> evtClick(RoutedEventsArgsPersonal e);
            public Login()
            {
                InitializeComponent();
                ClickEvent = EventManager.RegisterRoutedEvent(
                  "Click", RoutingStrategy.Bubble, typeof(RoutedEvent), typeof(evtClick));
            }
    
    
            public event RoutedEventHandler Click
            {
                add { AddHandler(ClickEvent, value);}
                remove { RemoveHandler(ClickEvent, value);}
            }
            private void button1_Click(object sender, RoutedEventArgs e)
            {
                RoutedEventsArgsPersonal ep = new RoutedEventsArgsPersonal(ClickEvent, "algo");
                RaiseEvent(ep);
            }
        }
    
        public class RoutedEventsArgsPersonal : RoutedEventArgs
        {
            public object Usuario { get; set; }
    
            public RoutedEventsArgsPersonal(RoutedEvent ev, object u)
            {
                base.RoutedEvent = ev;
                Usuario = u;
            }
        }
    }
    

    XAML del control:

    <UserControl x:Class="WpfApplication1.Login"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Height="86" Width="300">
        <Grid Height="72">
            <Button HorizontalAlignment="Right" Margin="0,33,16,12" Name="button1" Width="56" Click="button1_Click">Button</Button>
            <TextBox Margin="18,17,106,35" Name="textBox1" />
            <TextBox Height="21" Margin="18,0,106,9" Name="textBox2" VerticalAlignment="Bottom" />
        </Grid>
    </UserControl>
    

    Y así lo capturas:

            private void login_Click(object sender, RoutedEventArgs e)
            {
               Console.WriteLine(((RoutedEventsArgsPersonal) (e)).Usuario);
      
            }

    Fijate que hice un cast del tipo RoutedEventArgs al tipo del Evento Personalizado para poder acceder al usuario.

     

    Saludos,


    Sandro D. Garcia
    Colabora con el foro: Si este mensaje te es de utilidad marcalo como respuesta.
    -----
    Please, if this message helps you, remember mark it as response, may be can help more people with same problem.
    -----
    Mi Blog
  • pos medio que me maree un poco con todo pero lo estudiare un poco mas.. y buscare mas formas de ver como poder pasar ese objeto del tipo USUARIO con el evento enrutado.. :D gracias..  pero si a alguien se le ocurre otras maneras con gusto las discutiremos :D
    J. Fernando Galvez V. e-mail : fer_bolivia@hotmail.com skype : karnash
    lunes, 22 de marzo de 2010 20:18