2011-10-02 4 views
0

저는 70-511 권의 책을 읽고 Routed Events 섹션을보고 있습니다. 버블 링 터널링 이벤트 쌍이 동일한 EventArgs 인스턴스를 공유한다는 사실에 주목했습니다. 터널링 이벤트 (예 : PreviewMouseDown)를 처리하면 쌍으로 된 버블 링 이벤트 (예 : MouseDown)가 중단됩니다. 나는 이것을 시도하고 그것은 작동하지만 ...하지만, 만약 내가 EventArgs 같은 인스턴스가 아닌 것처럼 보인다 (테스트 목적을 위해 나는 두 이벤트에 대해 하나의 이벤트 처리기를 사용하고 있습니다) 이벤트 처리기가 발생할 때마다 평등을 테스트한다면 (즉, 그들은 서로 다른 해시 값을 가지며 Object.Equals는 false를 반환합니다) ... 왜 이것이 라우팅 된 이벤트가 작동하는지에 대한 이해가 크게 향상 될 것입니다.왜 내 터널링 이벤트 인수 객체와 버블 링 이벤트 인수 객체가 동일하지 않습니까?

모든 .NET 전문가가 설명하고 있습니다.

나는 프로 WPF 서적 (훌륭한 책)을 체크 아웃했다.이 또한 단지 다음과 같이 말하고있다 : "터널링 이벤트를 처리 된 것으로 표시하면 삶이 더 재미있어지기 때문에 버블 링 이벤트가 발생하지 않는다. 두 이벤트는 RoutedEventArgs 클래스의 동일한 인스턴스를 공유합니다. "

두 이벤트가 클래스의 동일한 인스턴스를 공유하는 경우 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)은 각 클릭에 대해 RoutedEventArgs의 새 인스턴스이기 때문에 'False'를 반환하지만 다음 터널링 이벤트는 버블 링 이벤트와 동일하므로 True을 반환합니다.

관련 문제