none
Assinar Eventos dos controles contidos em um UserControl RRS feed

  • Pergunta

  • Boa noite a todos,

     

    Minha dúvida é a seguinte, tenho um UserControl que contém 1 GroupBox e 3 buttons [btnExecutar, btnCancelar e btnFechar] conforme o Código

    <UserControl x:Class="MinhaNameSpace.UserControls.OpcoesList"
           xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
           xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
           xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
           xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
           mc:Ignorable="d" >
      <Grid>
        <GroupBox Name="GroupBox1" VerticalAlignment="Bottom" MinHeight="60" Header="Opções">
          <Grid>
            <Grid.ColumnDefinitions>
              <ColumnDefinition Width="Auto" />
              <ColumnDefinition Width="Auto" />
              <ColumnDefinition />
            </Grid.ColumnDefinitions>
            <Grid.RowDefinitions>
              <RowDefinition />
            </Grid.RowDefinitions>
            <Button Grid.Column="0" Name="btnExecutar" Content="Executar" MinWidth="60" MaxWidth="70" HorizontalAlignment="Left" Click="btnExecutar_Click" />
            <Button Grid.Column="1" Name="btnCancelar" Content="Cancelar" MinWidth="60" MaxWidth="70" HorizontalAlignment="Left" Click="btnCancelar_Click" />
            <Button Grid.Column="2" Name="btnFechar" Content="Fechar" MinWidth="60" HorizontalAlignment="Right" Click="btnFechar_Click" />
          </Grid>
        </GroupBox>
      </Grid>
    </UserControl>
    


    Para ter a possíbilidade de assinar esses eventos em outras Window tive que adicionar 3 Eventos Roteados já que cada botão terá comportamentos diferentes, conforme código abaixo:

      public partial class OpcoesList : UserControl
      {
        public OpcoesList()
        {
          InitializeComponent();
        }    
    
    
    
        public static readonly RoutedEvent Button1ClickEvent = EventManager.RegisterRoutedEvent(
          "ButtonClick1",
          RoutingStrategy.Bubble,
          typeof(RoutedEventHandler),
          typeof(OpcoesList));
    
        public static readonly RoutedEvent Button2ClickEvent = EventManager.RegisterRoutedEvent(
          "ButtonClick2",
          RoutingStrategy.Bubble,
          typeof(RoutedEventHandler),
          typeof(OpcoesList));
    
        public static readonly RoutedEvent Button3ClickEvent = EventManager.RegisterRoutedEvent(
          "ButtonClick3",
          RoutingStrategy.Bubble,
          typeof(RoutedEventHandler),
          typeof(OpcoesList));
    
        public event RoutedEventHandler Button1Click
        {
          add
          {
            AddHandler(Button1ClickEvent, value);
          }
          remove
          {
            RemoveHandler(Button1ClickEvent, value);
          }
        }
    
        public event RoutedEventHandler Button2Click
        {
          add
          {
            AddHandler(Button2ClickEvent, value);
          }
          remove
          {
            RemoveHandler(Button2ClickEvent, value);
          }
        }
    
        public event RoutedEventHandler Button3Click
        {
          add
          {
            AddHandler(Button3ClickEvent, value);
          }
          remove
          {
            RemoveHandler(Button3ClickEvent, value);
          }
        }
    
        private void btnExecutar_Click(object sender, RoutedEventArgs e)
        {
          RaiseEvent(new RoutedEventArgs(Button1ClickEvent));
        }
    
        private void btnCancelar_Click(object sender, RoutedEventArgs e)
        {
          RaiseEvent(new RoutedEventArgs(Button2ClickEvent));
        }
    
        private void btnFechar_Click(object sender, RoutedEventArgs e)
        {
          RaiseEvent(new RoutedEventArgs(Button3ClickEvent));
        }
    
        
        
      }
    


    E finalmente na Window eu assino os eventos dos buttons da seguinte maneira:

    <Window x:Class="MinhaNameSpace.CondicoesDoTempo.FrmCondicaoDoTempoList"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:Controles="clr-namespace:ManagerWPF.UserControls"
        Title="FrmCondicaoDoTempoList" Height="396" Width="664" Background="Black" MinHeight="396" MinWidth="664">
      <Grid>
        <Grid.RowDefinitions>
          <RowDefinition Height="Auto" MinHeight="60"/>
          <RowDefinition Height="*"/>
          <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
        <Controles:PesquisarList Grid.Row="0" HorizontalAlignment="Right" VerticalAlignment="Center" Margin="10" />
        <DataGrid Grid.Row="1" AutoGenerateColumns="True" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
        <Controles:OpcoesList Grid.Row="2" VerticalAlignment="Bottom" Button1Click="OpcoesList_Button1Click" Button2Click="OpcoesList_Button2Click" Button3Click="OpcoesList_Button3Click" />
      </Grid>
    </Window>
    

    Código C# para manipulação dos eventos:

      public partial class FrmCondicaoDoTempoList : Window
      {
        public FrmCondicaoDoTempoList()
        {
          InitializeComponent();
        }
    
        private void OpcoesList_Button1Click(object sender, RoutedEventArgs e)
        {
          Microsoft.Windows.Controls.MessageBox.Show("Button1 foi Clicado!", "Botão 1", MessageBoxButton.OK, MessageBoxImage.Information);
        }
    
        private void OpcoesList_Button2Click(object sender, RoutedEventArgs e)
        {
          Microsoft.Windows.Controls.MessageBox.Show("Button2 foi Clicado!", "Botão 2", MessageBoxButton.OK, MessageBoxImage.Information);
        }
    
        private void OpcoesList_Button3Click(object sender, RoutedEventArgs e)
        {
          this.Close();
        }
      }
    

     

    Assim está funcionando perfeitamente.. cada button tem seu comportamento!

     

    Então as dúvidas:

    1) Estou fazendo de forma correta a Exposição desses eventos para a Window?

    2) Visto que tenho 3 buttons com comportamentos diferentes eu realmente preciso criar 3 Eventos distintos no UserControl e mais 3 rotas?

    3) Se eu quizer usar N eventos de N controles contido em um UserControl então preciso criar N eventos e N Rotas (Meio trabalhoso né!)?

     

     

    Att

    Evandro

     

     

     


    Não há medalha de ouro sem suor e não há sucesso sem trabalho e dedicação!
    quinta-feira, 28 de julho de 2011 22:31

Respostas

  • Vc pode utilizar a vantagem dos RoutedEvents, o evento ser disparado tambem nos Parents, no seu caso vc poderia utilizar o AttachedEvent Click de buttonBase por exemplo:

     

    <Window ... ButtonBase.Click="Window_Click" ... />

     

    Qdo o cara clicar em um dos botões do seu de seu UC o evento será disparados nos elementos da VisualTree até atingir o elemento raiz, para identificar o botão vc pode passar um parametro para a propriedade Tag do botão...

     

    PS: Window_Click é o eventHandler para cliques dos botões, o botão do UserControl é o OriginalSource do argumento.


    Allan Tavares - Desenvolvedor Pleno - Spread Systems/Banco do Brasil
    • Sugerido como Resposta AndreAlvesLimaModerator sábado, 6 de agosto de 2011 02:05
    • Marcado como Resposta Pimpão segunda-feira, 8 de agosto de 2011 03:20
    sexta-feira, 5 de agosto de 2011 18:45

Todas as Respostas

  • Ola, Evandro

     

    A principio eu não vejo otra forma de se expor isso,

    pois cada button tera q ter seu comportamento..

    fico com a pergunta 3 tbm rs!

     

    abraço !!

     

    sexta-feira, 29 de julho de 2011 13:25
  • Vc pode utilizar a vantagem dos RoutedEvents, o evento ser disparado tambem nos Parents, no seu caso vc poderia utilizar o AttachedEvent Click de buttonBase por exemplo:

     

    <Window ... ButtonBase.Click="Window_Click" ... />

     

    Qdo o cara clicar em um dos botões do seu de seu UC o evento será disparados nos elementos da VisualTree até atingir o elemento raiz, para identificar o botão vc pode passar um parametro para a propriedade Tag do botão...

     

    PS: Window_Click é o eventHandler para cliques dos botões, o botão do UserControl é o OriginalSource do argumento.


    Allan Tavares - Desenvolvedor Pleno - Spread Systems/Banco do Brasil
    • Sugerido como Resposta AndreAlvesLimaModerator sábado, 6 de agosto de 2011 02:05
    • Marcado como Resposta Pimpão segunda-feira, 8 de agosto de 2011 03:20
    sexta-feira, 5 de agosto de 2011 18:45