2011-10-02 33 views
0

我正在通过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> 

回答

0

当我运行代码,然后单击按钮,它不会返回相同的散列码与“真”的e.Equals(args)。如果再次点击,e.Equals(args)会返回'False',因为它是每个点击次数为RoutedEventArgs的新实例,但下一个返回True,因为隧道事件与冒泡事件相同。