我想了解一個簡單的WPF應用程序中的RoutedEventArgs.Source屬性。這裏是XAML代碼事件冒泡和RoutedEventArgs來源屬性
<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>
這裏是背後
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;
}
}
}
代碼當我在InnerButton1 Click事件引發,然後執行OnInner1處理程序。 執行OnButton2處理程序後,該處理程序將發件人參數設置爲RoutedEventArgs.Source屬性。 如果您構建並執行此代碼,則可以看到輸出結果。 當事件到達OnOuterButtonClick處理程序時,底部ListBox中的輸出應爲:
inner1,sender:innerButton1;來源:innerButton1;原始來源:innerButton1
button2,sender:button2;來源:innerButton1;原始來源:innerButton1
外部事件,發件人:stackPanel1;來源:button2;原始來源:innerButton1
但輸出是這個
inner1,發件人:innerButton1;來源:innerButton1;原始來源:innerButton1
button2,sender:button2;來源:innerButton1;原始來源:innerButton1
外部事件,發件人:stackPanel1;來源:innerButton1;原始來源:innerButton1
在OnButton2投手重新分配的RoutedEventArgs.Source屬性更改,但返回到OnOuterButtonClick處理程序中引用innerButton1。
爲什麼會發生這種情況? 感謝