저는 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>