<StackPanel>
<StackPanel Background="Blue" Margin="3" x:Name="panel_Blue">
<Button Margin="3" Content="Button A" x:Name="btn_B1" Click="btn_B_Click" />
<Button Margin="3" Content="Button B" x:Name="btn_B2" Click="btn_B_Click" />
</StackPanel>
<StackPanel Background="Green" Margin="3" x:Name="panel_Green" ButtonBase.Click="panel_G_Click">
<Button Margin="3" Content="Button A" x:Name="btn_G1" />
<Button Margin="3" Content="Button B" x:Name="btn_G2" />
</StackPanel>
<StackPanel Background="Red" Margin="3" x:Name="panel_Red" ButtonBase.Click="panel_R_Click">
<Button Margin="3" Content="Button A" x:Name="btn_R1" Click="btn_R1_Click" />
<Button Margin="3" Content="Button B" x:Name="btn_R2" Click="btn_R2_Click" />
</StackPanel>
</StackPanel>
private void btn_B_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show(
"Click Blue Panel Button !",
"System Infomation",
MessageBoxButton.OK,
MessageBoxImage.Information);
MessageBox.Show(
string.Format("sender Type is {0}.", sender.GetType().Name));
Button sourceButton = (Button)(sender);
MessageBox.Show(
string.Format("Source Button is {0} !", sourceButton.Name),
"System Infomation",
MessageBoxButton.OK,
MessageBoxImage.Information);
}
private void panel_G_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show(
"Click Green Panel Button !",
"System Infomation",
MessageBoxButton.OK,
MessageBoxImage.Information);
MessageBox.Show(
string.Format("sender Type is {0}.", sender.GetType().Name));
MessageBox.Show(
string.Format("e.Source Type is {0}.", e.Source.GetType().Name));
Button sourceButton = (Button)(e.Source);
MessageBox.Show(
string.Format("Source Button is {0} !", sourceButton.Name),
"System Infomation",
MessageBoxButton.OK,
MessageBoxImage.Information);
}
private void panel_R_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show(
"Click Red Panel Button !",
"System Infomation",
MessageBoxButton.OK,
MessageBoxImage.Information);
}
private void btn_R1_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show(
"Click Red Panel Button A !",
"System Infomation",
MessageBoxButton.OK,
MessageBoxImage.Information);
}
private void btn_R2_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show(
"Click Red Panel Button B !",
"System Infomation",
MessageBoxButton.OK,
MessageBoxImage.Information);
e.Handled = true;
}
1、在panel_Blue中定义的三个按钮的Click事件属于“类事件”,即在类型对象中声明事件的绑定。此时事件响应方法中的sender指的就是由哪个对象引发的事件
2、在panel_Green中定义ButtonBase.Click="xxx",将其容器内所有的ButtonBase类型及其子类型的事件,统一绑定到一个事件处理方法上,统一处理。此时事件响应方法中的sender指的是panel_Green对象,而e.Source指的是引发ButtonBase.Click的某个按钮
3、路由事件的处理模型常用的有两种:
冒泡事件:由子控件位次向父容器传递,大部分的路由事件都是冒泡事件
隧道事件:由父容器位次向其子容器、控件传递,一般PreXXX事件属性隧道事件
4、使用路由事件响应方法中的e.Handled = true;意味着此事件已经被处理,将不再传递,默认e.Handled的值为false,意味着此路由事件还未处理完整,事件将依据其模型继续向下处理(即执行其他的事件处理方法)