none
Llamadas a eventos dentro de un Control Propio Silverlight RRS feed

  • Pregunta

  • Buenos dias, estoy realizando un control Silverlight el cual contiene como parte de el, un ComboBox entre otros controles, gracias a un compañero del foro logré desde la instancia de mi control en una pagina XAML obviamente, acceder a los eventos internos de por ejemplo este control interno ComboBox (que forma parte de mi control), pero siempre accediendo a el a traves de MiControl.Combobox.Evento+=... , lo cual me permite usar el evento del ComboBox, el tema que necesito que los eventos de los controles internos sean parte de mi control y no tener que acceder a ellos tocando los controles internos o sea encapsular en mi control la funcionalidad sin tener que acceder puntualmente al evento de un control interno que se supone es parte de un todo.

    No se si podran ayudarme y darme un ejemplito

    Gracias 

    jueves, 30 de diciembre de 2010 11:43

Respuestas

  • Hola Claudio.

    para realizarlo, como siempre se puede hacer de varias formas, dependiendo de tu arquitectura, de modo que te comento la que te servira en casi todos los casos:

    La idea consiste en la base del patron Facade, con el que basicamente haremos un Wrapper de los eventos.

    Bien, tan solo hay que realizar una redireccion de los eventos al evento en concreto que quieras usar, el problema de esto, es que tienes que hacer tantas como eventos quieras exponer en el control de usuario.

    basamos de un control de usuario simple con un boton y un comboBox, (escribo solo el grid para simplicar el ejemplo)

     

      <Grid x:Name="LayoutRoot" Background="White">
        <ComboBox Height="23" HorizontalAlignment="Left" Margin="80,34,0,0" Name="comboBox1" VerticalAlignment="Top" Width="120">
          <ComboBoxItem Content="elemento 1" />
          <ComboBoxItem Content="elemento 2" />
          <ComboBoxItem Content="elemento 3" />
          <ComboBoxItem Content="elemento 4" />
        </ComboBox>
        <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="80,89,0,0" Name="button1" VerticalAlignment="Top" Width="75" />
      </Grid>
    

     

    en este grid que esta dentro de un control de usuario, hay un combo y un boton, algo sencillo para probar.

    ahora en el codigo del control debemos exponer los eventos que queramos usar, algo como esto:

     

     public partial class TestControl : UserControl
      {
        public TestControl()
        {
          InitializeComponent();      
        }
    
        
        #region [wrapper de eventos]
    
        /// <summary>
        /// añadir o elimininar un evento de click en el boton
        /// </summary>
        public event RoutedEventHandler OnButton1Click
        {
          // añadir el evento
          add { button1.Click += value; }
    
          // eliminar el evento del boton
          remove { button1.Click -= value; }
        }
    
        /// <summary>
        /// añadir o elimininar un evento de cambio de seleccion del combobox
        /// </summary>
        public event SelectionChangedEventHandler OnComboBox1SelectionChanged
        {
          // añadir el evento
          add { comboBox1.SelectionChanged += value; }
    
          // eliminar el evento del boton
          remove { comboBox1.SelectionChanged -= value; }
        }
    
        #endregion [wrapper de eventos]
    
      }
    

     

    en concreto la region, es la que contiene la redireccion de eventos, tan solo se declaran nuevos eventos y se redirigen a los eventos de los controles que quieras, en este caso, he usado el 'click' del boton y el 'selectionChanged' del combo.

    Con esto ya estaria todo y puedes hacer uso del control de usuario que tendra estos 2 nuevos eventos y seran redirigidos a sus controles especificos (ademas tambien los veras en tiempo de diseño en la ventana de eventos)

    Debes de tener en cuenta que el boton y el combo, de esta forma, tambien estaran visibles desde fuera y podras usarlos como comentabas, de modo que si no queires eso, debes establecer el boton y el combo como privados o protegidos (dependiendo).

     

    ahora para usar el control de usuario lo montas en un control de silverlight y haces uso de sus eventos, algo como esto:

    codigo xaml:

      <Grid x:Name="LayoutRoot" Background="White">
        <my:TestControl HorizontalAlignment="Left" Margin="98,90,0,0" x:Name="testControl1" VerticalAlignment="Top" Height="163" Width="266" 
          OnButton1Click="testControl1_OnButton1Click" OnComboBox1SelectionChanged="testControl1_OnComboBox1SelectionChanged" />
      </Grid>
    

     

    codigo .cs

      public partial class MainPage : UserControl
      {
        public MainPage()
        {
          InitializeComponent();
          
        }
    
        /// <summary>
        /// Evento ocurrido al hacer click en el boton interno del control de usuario
        /// </summary>
        /// <param name="sender">objeto remitente</param>
        /// <param name="e">argumentos del evento</param>
        private void testControl1_OnButton1Click(object sender, RoutedEventArgs e)
        {
          MessageBox.Show("boton 1 pulsado");
        }
    
        /// <summary>
        /// Evento ocurrido al cambiar la seleccion en el combobox interno del control de usuario
        /// </summary>
        /// <param name="sender">objeto remitente</param>
        /// <param name="e">argumentos del evento</param>
        private void testControl1_OnComboBox1SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
          // obtener el valor del item
          string value = ((ComboBoxItem)((ComboBox)sender).SelectedItem).Content.ToString();
          // mostrar el mensaje
          MessageBox.Show("elemento:" + value + " seleccionado");
        }
      }
    

    y con esto ya estaria todo.

    Solo tienes que modificarlo a tu aplicacion.

    Ya contaras que tal.

     


    Saludos
    David González
    MCP, MCTS
    Visita mi Blog en: http://www.dgzornoza.com/
    • Marcado como respuesta Claudio Lozano viernes, 31 de diciembre de 2010 12:41
    viernes, 31 de diciembre de 2010 10:27