I am trying to understand the RoutedEventArgs.Source property in a simple WPF application. Here is the XAML Code
<Window x:Class="BubbleDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<StackPanel x:Name="stackPanel1" Button.Click="OnOuterButtonClick">
<Button x:Name="button1" Content="Button 1" Margin="5" />
<Button x:Name="button2" Margin="5" Click="OnButton2">
<ListBox x:Name="listBox1">
<Button x:Name="innerButton1" Content="Inner Button 1" Margin="4" Padding="4" Click="OnInner1" />
<Button x:Name="innerButton2" Content="Inner Button 2" Margin="4" Padding="4" Click="OnInner2" />
</ListBox>
</Button>
<ListBox ItemsSource="{Binding}" />
</StackPanel>
</Window>
And here is the code behind
using System;
using System.Collections.ObjectModel;
using System.Windows;
namespace BubbleDemo
{
public partial class MainWindow : Window
{
private ObservableCollection<string> messages = new ObservableCollection<string>();
public MainWindow()
{
InitializeComponent();
this.DataContext = messages;
}
private void AddMessage(string message, object sender, RoutedEventArgs e)
{
messages.Add(String.Format("{0}, sender: {1}; source: {2}; original source: {3}",
message, (sender as FrameworkElement).Name,
(e.Source as FrameworkElement).Name,
(e.OriginalSource as FrameworkElement).Name));
}
private void OnOuterButtonClick(object sender, RoutedEventArgs e)
{
AddMessage("outer event", sender, e);
}
private void OnInner1(object sender, RoutedEventArgs e)
{
AddMessage("inner1", sender, e);
}
private void OnInner2(object sender, RoutedEventArgs e)
{
AddMessage("inner2", sender, e);
e.Handled = true;
}
private void OnButton2(object sender, RoutedEventArgs e)
{
AddMessage("button2", sender, e);
e.Source = sender;
}
}
}
When I click on InnerButton1 the click event is raised and then is executed the OnInner1 handler. After is executed the OnButton2 Handler which sets the RoutedEventArgs.Source property with the sender parameter. If you build and execute this code, you can see the output results. When the event arrives on the OnOuterButtonClick handler, the output in the bottom ListBox should be:
inner1, sender: innerButton1; source: innerButton1; original source: innerButton1
button2, sender: button2; source: innerButton1; original source: innerButton1
outer event, sender: stackPanel1; source: button2; original source: innerButton1
but the output is this
inner1, sender: innerButton1; source: innerButton1; original source: innerButton1
button2, sender: button2; source: innerButton1; original source: innerButton1
outer event, sender: stackPanel1; source: innerButton1; original source: innerButton1
The RoutedEventArgs.Source property reassigned in the OnButton2 hander is changed but returns to reference innerButton1 within the OnOuterButtonClick handler.
Why this happens? Thanks