2011-10-02 45 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,因爲隧道事件與冒泡事件相同。