Usuário com melhor resposta
Assinar Eventos dos controles contidos em um UserControl

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!
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
Todas as 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