我正在通过70-511的书,我正在看路由事件的部分。 我注意到它提到bubbling-tunneling事件对共享相同的EventArgs实例,所以如果你处理隧道事件(例如PreviewMouseDown),它会暂停配对的冒泡事件(例如MouseDown)。我试过这个,它的工作原理......但是,如果我每次事件处理程序触发时测试相等(为了测试目的,我对这两个事件使用了1个事件处理程序),看起来好像EventArgs不是同一个实例(即他们有不同的哈希值和Object.Equals返回false)... 这将大大提高我对路由事件如何工作的理解,如果我能弄清楚为什么这是!为什么我的隧道事件参数对象和冒泡事件参数对象不相等?
任何.NET大师我们在那里关心解释?
我已经检查了临的WPF书(出色的书),这也只是说明: “为了让生活更有趣,如果您将隧道事件标记为已处理,冒泡事件将不会发生。这两个事件共享RoutedEventArgs类的同一个实例。“
如果两个事件共享一个类的SAME INSTANCE,那么eventargs不应该有相同的散列值,并返回Object.Equals的“True”?
private RoutedEventArgs args;
private void MouseDownHandler(object sender, MouseButtonEventArgs e)
{
listEvents.Items.Add(string.Format("{0} - {1} - {2} - {3}",
sender.GetType().Name, e.RoutedEvent.ToString(), e.Source.GetType().Name,
e.OriginalSource.GetType().Name));
listEvents.Items.Add(e.GetHashCode().ToString());
if (args != null) listEvents.Items.Add(e.Equals(args).ToString());
args = e;
}
的XAML:
<Window x:Class="Chapter_2___WPF_RoutedEvents.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="428" Width="658"
PreviewMouseDown="MouseDownHandler" MouseDown="MouseDownHandler">
<Grid Name="grid"
MouseDown="MouseDownHandler" PreviewMouseDown="MouseDownHandler">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<ListBox Name="listEvents" Grid.Column="1"/>
<Button Content="Click Me!" Width="150" Height="50" Margin="10" Grid.Column="0"
MouseDown="MouseDownHandler" PreviewMouseDown="MouseDownHandler"/>
</Grid>
</Window>